копирование сбрасывающего пространства и слияние токенов - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь разобрать некоторый код verilog, и я надеюсь просто разобрать его разделы.Я не знаю pyparsing достаточно хорошо, чтобы написать полный синтаксический анализатор.Я работаю над разделом порта.Здесь он может иметь дополнительные теги, такие как «вход» и «выход».Итак, следующие допустимые порты:

random_signal
input random_signal

Проблема, с которой я столкнулся, заключается в том, что кто-то выбрал имя порта:

input1

Когда я анализирую эту строку, pyparser разделяет строку на «вход»и "1".

Вот что у меня есть:

from pyparsing import alphas, nums
from pyparsing import Literal, Group, Optional, Word

port_name = Word( alphas + nums + "_") | "\\do "
in_type = Literal("input") | Literal("output") | Literal("RFnet") | Literal("inout")
var_real = Literal("var") + Literal("real")
bus_index = Word( nums )
in_bus = Literal("[") + bus_index + Optional(":") + Optional(bus_index) + Literal("]")
in_pin = Group(Optional(in_type) + Optional(var_real) + Optional(Literal("wire")) +
               Optional(in_bus) +
               port_name.setResultsName('port_name', listAllMatches=True))

# Test some ports
in_list = ['random_signal', 'input random_signal', 'input1', 'input input1']
for in_str in in_list:
    print in_str, in_pin.parseString(in_str)

Вот вывод:

random_signal [['random_signal']]
input random_signal [['input', 'random_signal']]
input1 [['input', '1']]
input input1 [['input', 'input1']]

Я бы хотел, чтобы input1 возвратил: [['input1']]

Спасибо за помощь.

...