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'

任何人都可以帮助我我做错了什么? 谢谢

这是您的代码中所有问题的列表:

  1. 导入语句。您错过了正确导入模块的机会。我不确定你是怎么做到的,但是导入这些模块的正确方法是

    import ply.lex as lex
    import ply.yacc as yacc
    
  2. 指定了 PRINT 标记,但没有为其定义规则。像这样定义规则:

    t_PRINT = r'print'
    
  3. 打印语句的语法规则应该指定标记名称,而不是标记匹配的内容。

    def p_print(p):
      r'statement : PRINT LPAREN STRING RPAREN'
      ...
    
  4. 去掉了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 规则。