Отладка грамматики Pyparsing

в нашей компании мы используем alienbrain, но мы мигрируем на По необходимости. По необходимости имеет все, что Вы хотите: это код hadles и данные, он интегрирует инструменты для непрерывной интеграции, это обрабатывает локальный (на разработчика) репозиторий, таким образом, Вы можете регистрация в своем локальном репозитории прежде, чем фиксировать на сервере.

я голосую за По необходимости

20
задан greenie 1 December 2009 в 14:16
поделиться

1 ответ

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()

Затем, когда вы перейдете к фактическому определению их с их рекурсивными определениями,

33
ответ дан 30 November 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: