如何使用 lex in ply python 区分任何单词和特定单词?
How can I differentiate between any word and a specific word with lex in ply, python?
我正在编写一个程序来识别它是一个特定的指令还是一个要处理的指令的 ID,所以这个程序打印的是:
LexToken(ID,'Sets',1,0)
LexToken(SEMICOLON,';',1,4)
但问题是 Sets 是 CMDSETS 而不是 ID,所以我如何比较它是指令还是常规 ID?
代码:
import ply.lex as lex
import ply.yacc as yacc
tokens = [
'CMDSETS',
'CMDUNION',
'ID',
'COLON',
'SEMICOLON',
]
t_CMDSETS=r'Sets'
t_CMDUNION=r'Union'
t_COLON= r','
t_SEMICOLON=r';'
def t_ID(t):
r'[a-zA-Z_][a-zA-Z0-9_]*'
t.type='ID'
return t
t_ignore=r' '
def t_error(t):
print("This thing failed")
t.lexer.skip(1)
lexer=lex.lex()
lexer.input("Sets;")
while True:
tok=lexer.token()
if not tok:
break
print(tok)
PLY 文档explains this exact case。表面上的答案是它更喜欢与来自函数而不是来自变量的正则表达式匹配。但是这样的关键字无论如何都不起作用:它们会匹配 "Setser" 和 "Unionize" 之类的东西。因此,只需检查 t_ID
中的关键字并在需要时重置 t.type
。
我正在编写一个程序来识别它是一个特定的指令还是一个要处理的指令的 ID,所以这个程序打印的是:
LexToken(ID,'Sets',1,0)
LexToken(SEMICOLON,';',1,4)
但问题是 Sets 是 CMDSETS 而不是 ID,所以我如何比较它是指令还是常规 ID?
代码:
import ply.lex as lex
import ply.yacc as yacc
tokens = [
'CMDSETS',
'CMDUNION',
'ID',
'COLON',
'SEMICOLON',
]
t_CMDSETS=r'Sets'
t_CMDUNION=r'Union'
t_COLON= r','
t_SEMICOLON=r';'
def t_ID(t):
r'[a-zA-Z_][a-zA-Z0-9_]*'
t.type='ID'
return t
t_ignore=r' '
def t_error(t):
print("This thing failed")
t.lexer.skip(1)
lexer=lex.lex()
lexer.input("Sets;")
while True:
tok=lexer.token()
if not tok:
break
print(tok)
PLY 文档explains this exact case。表面上的答案是它更喜欢与来自函数而不是来自变量的正则表达式匹配。但是这样的关键字无论如何都不起作用:它们会匹配 "Setser" 和 "Unionize" 之类的东西。因此,只需检查 t_ID
中的关键字并在需要时重置 t.type
。