Nic*_*ner 12 python parsing nlp yacc
我正在尝试在语法中使用保留字:
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
Run Code Online (Sandbox Code Playgroud)
但是,t_ID规则以某种方式吞下DEPT_CODE和OR_CONJ.我怎么能绕过这个?我希望那两个人比保留的词更优先.
Nas*_*nov 16
好吧,我今天遇到了这个问题并寻找解决方案 - 没有在S/O上找到它 - 但在手册中找到了它:http://www.dabeaz.com/ply/ply.html#ply_nn6
构建主正则表达式时,将按以下顺序添加规则:
- 函数定义的所有标记的添加顺序与它们在lexer文件中出现的顺序相同.
- 接下来通过按正则表达式长度递减的顺序对字符串定义的标记进行排序(首先添加较长的表达式).
这就是t_ID"击败"字符串定义的原因.一个微不足道(虽然残酷)的解决方案将在def t_DEPT_CODE(token): r'[A-Z]{2,}'; return token之前完成def t_ID
我想到了两件事:
因此我会按如下方式解决它:包含“or”作为保留字,并在t_ID中检查字符串的长度是否为2以及是否仅由大写字母组成。如果是这种情况,则返回 DEPT_CODE。
| 归档时间: |
|
| 查看次数: |
2804 次 |
| 最近记录: |