我怎样才能处理一到多条规则呢?
tokens = (
'VAR1',
'VAR2',
'TRUE',
'SINGLE_CHAR',
)
def t_VAR1(t):
r'var1'
return t
def t_VAR2(t):
r'var2'
return t
def t_TRUE(t):
r't|T'
return t
def t_SINGLE_CHAR(t):
r'[A-Za-z]'
return t如果我有两条规则。
def p_expression_variable2(p):
'''variable2 : VAR2 SINGLE_CHAR'''
print("got VAR2")
def p_expression_variable1(p):
'''variable1 : VAR1 TRUE'''
print("got VAR1")我想制定规则,以便var1 T与p_expression_variable1匹配,var2 T与p_expression_variable2匹配。但是由于t_TRUE是t_SINGLE_CHAR的一个子集,所以T总是与t_TRUE匹配,从而产生错误。
我是lex和yacc的新手,想知道如何处理这类问题的规则。我知道它可以通过条件词法(定义两种状态)来处理,但是有办法用单一状态来处理吗?
发布于 2022-06-14 14:14:10
不是以你想做的方式。
在yacc/lex解析模型中,不考虑解析器的状态进行词法分析。这就是将句法分析和词法分析分离成不同的组成部分的要点。如果您希望它们以您建议的方式进行交互,您将不得不使用无扫描分析器,但这涉及到一定的成本,包括语法复杂性和解析算法,因为生成的语法不太可能只适用于单个字符的前瞻性。
使用lex/yacc框架,您可以使用多个词法状态,但这需要解析器向词法分析器反馈,通常使用中间规则行动 (通常不支持),或者在词法分析器中手工构建的状态机中复制部分语法分析。这两种解决方案都是不优雅的、不可扩展的和不必要的笨重。(尽管如此,它们比人们可能希望的还要普遍。)
您可以做的是使词法分析明确:
def t_TRUE(t):
r'[tT]'
return t
def t_SINGLE_CHAR(t):
r'[A-SU-Za-su-z]'
return t并在解析器中实现一种词法回退:
def p_any_char(p):
'''any_char : SINGLE_CHAR
| TRUE
'''
p[0] = p[1]
def p_expression_variable2(p):
'''variable2 : VAR2 any_char'''
print("got VAR2")
def p_expression_variable1(p):
'''variable1 : VAR1 TRUE'''
print("got VAR1")https://stackoverflow.com/questions/72612777
复制相似问题