1

I am writing regular expressions with PLY but it seems it doesn't behave like yacc.

I've written this:

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

to express the fact that a TYPE can only take those values: Discrete, or Continuous.

I have the followed errors:

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

Could somebody tell me what's wrong with my code? Must I definethose king of expressions as tokens?

Thanks to you

4

1 回答 1

1

正则表达式和 yacc 是不同种类的动物。它有助于理解Chomsky Type 3 和 Chomsky Type 2 语言之间的区别。flex 使用的正则表达式和 PLY 的词法分析部分是 Chomsky 类型 3。 Yacc 和 PLY 的语法规则部分表示是针对上下文无关语法的,即 Chomsky 类型 2。

它们有不同的用途、不同的特性和不同的符号。因此,您不能采取速记或从一个到另一个的规则。但是,您可以用正则表达式编写的所有内容都可以由上下文无关文法处理;只是写法不同。(只是有一点计算机科学理论潜入其中)。

还值得参考一本很好的 PLY 手册,其中有类似的示例

因此,对于您的示例,可以编写 TYPE 的语法规则:

def p_expression_TYPE (p):
'''
    TYPE : 'Discrete'
         | 'Continuous' 
'''

不幸的是,PLY 有一个限制,任何字符文字,例如'Discrete'and'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 
'''
于 2015-02-27T11:14:40.257 回答