我正在尝试使用 Ply 解析文件。我需要能够识别表达式格式“a = 1;” (名称等于数字分号)。只要输入中每行只有一个表达式(a = 1;),一切都可以正常工作,但是当每行有多个表达式(a = 1; b = 2;)时,yacc 会出错。我已经确认一切都被正确标记,所以我不确定问题是什么。
这是我的代码的最小版本:
tokens = (
'EQUALS',
'SEMICOLON',
'NAME',
'VALUE',
)
t_ignore = ' \t'
def t_EQUALS(t):
r"""="""
return t
def t_SEMICOLON(t):
r""";"""
return t
def t_NAME(t):
r"""\S+\s*(?==)"""
t.value = t.value.strip()
return t
def t_VALUE(t):
r"""(?<==)[^;]+"""
t.value = t.value.strip()
return t
def t_newline(t):
r"""\n"""
t.lexer.lineno += len(t.value)
def t_error(t):
print("Illegal character '%s' on line %d" % (t.value[0], t.lineno))
t.lexer.skip(1)
def t_eof(t):
return None
lexer = lex.lex()
def p_expression(p):
'''
expression : item
| empty
'''
p[0] = p[1]
def p_item(p):
'''
item : NAME EQUALS VALUE SEMICOLON
'''
p[0] = ('name', p[1], p[3])
def p_error(p):
print('Syntax error' + str(p) + " Line " + str(p.lineno))
parser = yacc.yacc()
for line in file:
print(parser.parse(line))