Регулярные выражения в коде yacc с PLY
Я пишу регулярные выражения с помощью PLY, но, похоже, он не ведет себя как yacc.
Я написал это:
def p_expression_TYPE (p):
'''
TYPE : [' Discrete ', ' Continuous ' ]
'''
чтобы выразить тот факт, что ТИП может принимать только эти значения: дискретный или непрерывный.
У меня есть следующие ошибки:
ERROR: la_grammaire_yacc.py:31: Illegal name '['' in rule 'TYPE'
Может кто-нибудь сказать мне, что не так с моим кодом? Должен ли я определить короля выражений как токены?
Благодаря вам
1 ответ
Регулярные выражения и yacc - это разные виды животных. Это помогает понять разницу между хомским языком типа 3 и хомским языком типа 2. Регулярное выражение, используемое flex и частью лексического анализа PLY, относится к типу Chomsky 3. Yacc, а часть правил грамматики PLY представляет для контекстно-свободной грамматики, которая является типом Chomsky 2.
У них разные цели, разные характеристики и разные обозначения. В результате вы не можете взять короткую руку или править от одного к другому. Однако все, что вы можете написать в регулярном выражении, может быть обработано безконтекстной грамматикой; просто написано по другому. (Просто немного теории информатики ползет туда).
Также стоит обратиться к хорошему руководству по PLY, в котором есть похожие примеры.
Итак, для вашего примера, правило синтаксиса для TYPE может быть написано:
def p_expression_TYPE (p):
'''
TYPE : 'Discrete'
| 'Continuous'
'''
К сожалению, у PLY есть ограничение, что любые символьные литералы, такие как 'Discrete'
а также 'Continuous'
должен быть объявлен как токены в части lex:
import ply.lex as lex
# List of token names. This is always required
tokens = (
'DISCRETE',
'CONTINUOUS'
)
# Regular expression rules for simple tokens
t_DISCRETE = r'Discrete'
t_CONTINUOUS = r'Continuous'
Теперь мы можем поместить парсер в yacc.py как
def p_expression_TYPE (p):
'''
TYPE : DISCRETE
| CONTINUOUS
'''