PLY 函数声明的解析错误
PLY Parsing error for function declaration
我试图在 python
中解析以下源语言
print("hello")
我在 PLY 中所做的如下
import ply
import yacc
tokens =('LPAREN','RPAREN','STRING','PRINT')
reserved ={
('print': 'PRINT')
}
t_LPAREN ='\('
t_RPREN = '\)'
t_STRING = r'\".*?\"'
t_ignore = " \t"
def p_print(p):
'statement : print LPAREN STRING RPAREN'
print(p[3])
def p_error(p):
print("Syntax error at %s"%p.value)
lex.lex()
yacc.yacc()
s ='print("Hello")'
yacc.parse(s)
我原以为它会打印 Hello
。但是我收到错误
Syntax err at 'print'
任何人都可以帮助我我做错了什么?
谢谢
这是您的代码中所有问题的列表:
导入语句。您错过了正确导入模块的机会。我不确定你是怎么做到的,但是导入这些模块的正确方法是
import ply.lex as lex
import ply.yacc as yacc
指定了 PRINT
标记,但没有为其定义规则。像这样定义规则:
t_PRINT = r'print'
打印语句的语法规则应该指定标记名称,而不是标记匹配的内容。
def p_print(p):
r'statement : PRINT LPAREN STRING RPAREN'
...
去掉了reserved
结构,好像没有用。
修复这些错误后,我们有:
import ply.lex as lex
import ply.yacc as yacc
tokens =('LPAREN','RPAREN','STRING','PRINT')
t_LPAREN ='\('
t_RPAREN = '\)'
t_STRING = r'\".*?\"'
t_PRINT = r'print'
t_ignore = " \t"
def p_print(p):
'statement : PRINT LPAREN STRING RPAREN'
print(p[3])
def p_error(p):
print("Syntax error at %s"%p.value)
lex.lex()
yacc.yacc()
s ='print("Hello")'
yacc.parse(s)
输出:
WARNING: No t_error rule is defined
"Hello"
目前还可以,但请为大型程序定义一个 t_error
规则。
我试图在 python
中解析以下源语言print("hello")
我在 PLY 中所做的如下
import ply
import yacc
tokens =('LPAREN','RPAREN','STRING','PRINT')
reserved ={
('print': 'PRINT')
}
t_LPAREN ='\('
t_RPREN = '\)'
t_STRING = r'\".*?\"'
t_ignore = " \t"
def p_print(p):
'statement : print LPAREN STRING RPAREN'
print(p[3])
def p_error(p):
print("Syntax error at %s"%p.value)
lex.lex()
yacc.yacc()
s ='print("Hello")'
yacc.parse(s)
我原以为它会打印 Hello
。但是我收到错误
Syntax err at 'print'
任何人都可以帮助我我做错了什么? 谢谢
这是您的代码中所有问题的列表:
导入语句。您错过了正确导入模块的机会。我不确定你是怎么做到的,但是导入这些模块的正确方法是
import ply.lex as lex import ply.yacc as yacc
指定了
PRINT
标记,但没有为其定义规则。像这样定义规则:t_PRINT = r'print'
打印语句的语法规则应该指定标记名称,而不是标记匹配的内容。
def p_print(p): r'statement : PRINT LPAREN STRING RPAREN' ...
去掉了
reserved
结构,好像没有用。
修复这些错误后,我们有:
import ply.lex as lex
import ply.yacc as yacc
tokens =('LPAREN','RPAREN','STRING','PRINT')
t_LPAREN ='\('
t_RPAREN = '\)'
t_STRING = r'\".*?\"'
t_PRINT = r'print'
t_ignore = " \t"
def p_print(p):
'statement : PRINT LPAREN STRING RPAREN'
print(p[3])
def p_error(p):
print("Syntax error at %s"%p.value)
lex.lex()
yacc.yacc()
s ='print("Hello")'
yacc.parse(s)
输出:
WARNING: No t_error rule is defined
"Hello"
目前还可以,但请为大型程序定义一个 t_error
规则。