Регулярные выражения в коде yacc с PLY

Я пишу регулярные выражения с помощью PLY, но, похоже, это не похоже на yacc.

Я написал это:

def p_expression_TYPE (p):
'''
    TYPE :  [' Discrete ',  ' Continuous ' ]
'''

чтобы выразить тот факт, что TYPE может принимать только следующие значения: Discrete или Continuous.

У меня есть следующие ошибки:

ERROR: la_grammaire_yacc.py:31: Illegal name '['' in rule 'TYPE'

Может ли кто-нибудь сказать мне, что не так с моим кодом? Должен ли я определять этих королей выражений как токены?

Благодаря вам


person dimele    schedule 16.05.2014    source источник


Ответы (1)


Регулярные выражения и yacc — это разные животные. Это помогает понять разницу между Chomsky Type 3 и языки Хомского типа 2. Регулярные выражения, которые используются flex и частью лексического анализа PLY, относятся к типу 3 по Хомскому.

У них разное назначение, разные характеристики и разные обозначения. В результате вы не можете взять стенограмму или перейти от одного к другому. Однако все, что вы можете написать в регулярном выражении, может быть обработано контекстно-независимой грамматикой; просто написано по другому. (Там только немного теории информатики).

Также стоит обратиться к хорошему руководству по 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 
'''
person Brian Tompsett - 汤莱恩    schedule 27.02.2015