в нашей компании мы используем alienbrain, но мы мигрируем на По необходимости. По необходимости имеет все, что Вы хотите: это код hadles и данные, он интегрирует инструменты для непрерывной интеграции, это обрабатывает локальный (на разработчика) репозиторий, таким образом, Вы можете регистрация в своем локальном репозитории прежде, чем фиксировать на сервере.
я голосую за По необходимости
1) Измените Литерал ("если")
на Ключевое слово ("если")
(и так далее, вплоть до Литерал ( "void")
), чтобы предотвратить сопоставление ведущего "if" переменной с именем ifactor
.
2) nums
, alphas
] и буквенные символы
не являются выражениями, это строки, которые можно использовать с классом Word для определения некоторых типичных наборов символов при определении «слов», таких как «число - это слово, состоящее из чисел» , или «идентификатор - это слово, которое начинается с буквы альфа, за которой следует ноль или более букв». Итак, вместо:
number = nums
identifier = alphas + OneOrMore(alphanums)
вы хотите
number = Word(nums)
identifier = Word(alphas, alphanums)
3) Вместо Объединить
, я думаю, вам нужна Группа
. Используйте Combine
, если вы хотите, чтобы совпадающие токены были смежными без промежуточных пробелов, и объедините токены и вернете их как одну строку. Combine
часто используется в таких случаях:
realnum = Combine(Word(nums) + "." + Word(nums))
Без Combine
, синтаксический анализ «3.14»
вернет список строк ['3' , '.', '14']
, поэтому мы добавляем Combine
, чтобы результат синтаксического анализа для вещественного числа был '3.14'
(который затем можно было бы передать в действие синтаксического анализа для преобразования в фактическое плавающее значение 3.14
). Обеспечение Combine
отсутствия промежуточных пробелов также предохраняет нас от случайного синтаксического анализа «Ответ 3,10 - это слишком много»
и мышления «3,10».
представляет собой действительное число.
4) Это не должно вызывать вашу ошибку, но ваша входная строка содержит много лишних пробелов. Если ваша грамматика работает, вы сможете анализировать "int x;"
так же хорошо, как "int x;"
.
Надеюсь, некоторые из этих советов вам помогут собирается. Вы читали какие-либо статьи или учебные пособия по pyparsing в Интернете? И, пожалуйста, просмотрите онлайн-примеры. Вам нужно будет хорошо понять, как Word
, Literal
, Combine
и т. Д. Выполняют свои отдельные задачи синтаксического анализа.
5) У вас есть неправильно реализованы рекурсивные определения для термина и оператора. Вместо того, чтобы назначать им ''
, напишите:
term = Forward()
statement = Forward()
Затем, когда вы перейдете к фактическому определению их с их рекурсивными определениями,