Регулярные выражения в коде 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 
'''
Другие вопросы по тегам