我正在尝试在语法中使用保留字:

reserved = {
   'if' : 'IF',
   'then' : 'THEN',
   'else' : 'ELSE',
   'while' : 'WHILE',
}

tokens = [
 'DEPT_CODE',
 'COURSE_NUMBER',
 'OR_CONJ',
 'ID',
] + list(reserved.values())

t_DEPT_CODE = r'[A-Z]{2,}'
t_COURSE_NUMBER  = r'[0-9]{4}'
t_OR_CONJ = r'or'

t_ignore = ' \t'

def t_ID(t):
 r'[a-zA-Z_][a-zA-Z_0-9]*'
 if t.value in reserved.values():
  t.type = reserved[t.value]
  return t
 return None

但是,t_ID规则以某种方式吞没了DEPT_CODE和OR_CONJ。我该如何解决?我希望这两个优先级高于保留字。

最佳答案

谜团已揭开!

好的,我今天自己遇到了这个问题,寻找解决方案-在S/O上找不到它-但在手册中找到了它:http://www.dabeaz.com/ply/ply.html#ply_nn6



这就是为什么t_ID“跳动”字符串定义的原因。一个微不足道的(尽管很残酷的)修复将是
只是def t_DEPT_CODE(token): r'[A-Z]{2,}'; return token之前的def t_ID

09-04 10:30