gpt4 book ai didi

parsing - Ply Lex 解析问题

转载 作者:行者123 更新时间:2023-12-02 16:41:57 31 4
gpt4 key购买 nike

我使用 ply 作为我的 lex 解析器。我的规范如下:

t_WHILE = r'while'  
t_THEN = r'then'
t_ID = r'[a-zA-Z_][a-zA-Z0-9_]*'
t_NUMBER = r'\d+'
t_LESSEQUAL = r'<='
t_ASSIGN = r'='
t_ignore = r' \t'

当我尝试解析以下字符串时:

"while n <= 0 then h = 1"

它给出以下输出:

LexToken(ID,'while',1,0)  
LexToken(ID,'n',1,6)
LexToken(LESSEQUAL,'<=',1,8)
LexToken(NUMBER,'0',1,11)
LexToken(ID,'hen',1,14) ------> PROBLEM!
LexToken(ID,'h',1,18)
LexToken(ASSIGN,'=',1,20)
LexToken(NUMBER,'1',1,22)

它无法识别 token THEN,而是采用“hen”作为标识符。

有什么想法吗?

最佳答案

这不起作用的原因与 ply 优先考虑 token 匹配的方式有关,首先测试最长的 token 正则表达式。

防止此问题的最简单方法是匹配同一类型的标识符和保留字,并根据匹配结果选择合适的 token 类型。以下代码类似于 ply documentation 中的示例

import ply.lex

tokens = [ 'ID', 'NUMBER', 'LESSEQUAL', 'ASSIGN' ]
reserved = {
'while' : 'WHILE',
'then' : 'THEN'
}
tokens += reserved.values()

t_ignore = ' \t'
t_NUMBER = '\d+'
t_LESSEQUAL = '\<\='
t_ASSIGN = '\='

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

def t_error(t):
print 'Illegal character'
t.lexer.skip(1)

lexer = ply.lex.lex()
lexer.input("while n <= 0 then h = 1")
while True:
tok = lexer.token()
if not tok:
break
print tok

关于parsing - Ply Lex 解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5022129/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com