使用PLY在yacc代码中使用正则表达式

时间:2014-05-16 06:19:44

标签: regex yacc ply

我正在用PLY编写正则表达式,但似乎它的行为与yacc不同。

我写过:

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

表示TYPE只能采用这些值:离散或连续。

我有以下错误:

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

有人可以告诉我我的代码有什么问题吗? 我必须将表达之王定义为令牌吗?

谢谢你

1 个答案:

答案 0 :(得分:1)

正则表达式和yacc是不同种类的动物。它有助于理解difference between Chomsky Type 3 and Chomsky type 2 languages。由flex和PLY的词法分析部分使用的正则表达式是Chomsky类型3.Yacc,而PLY的语法规则部分是用于无上下文语法,即Chomsky类型2。

他们有不同的目的,不同的特点和不同的符号。因此,你不能采取简短的手段,或从一个到另一个的规则。但是,您可以在正则表达式中编写的所有内容都可以通过无上下文语法来处理;只是写得不同。 (只是有点计算机科学理论在那里蔓延)。

还值得咨询good manual on PLY, which has similar examples

因此,对于您的示例,可能会写入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 
'''