首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ply Lex解析问题

Ply Lex解析问题
EN

Stack Overflow用户
提问于 2011-02-17 05:09:30
回答 2查看 9.4K关注 0票数 7

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

代码语言:javascript
复制
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'  

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

代码语言:javascript
复制
"while n <= 0 then h = 1"

它提供以下输出:

代码语言:javascript
复制
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)  

然后,它不能识别令牌,而是将"hen“作为标识符。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-17 19:18:44

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

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

代码语言:javascript
复制
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
票数 9
EN

Stack Overflow用户

发布于 2012-05-11 00:28:12

PLY根据最长的正则表达式对声明为简单字符串的标记进行优先排序,但声明为函数的标记具有优先顺序。

从文档中:

构建主正则表达式时,规则按以下顺序添加:

  1. 所有由函数定义的标记的添加顺序与它们在词法分析器文件中的显示顺序相同。由字符串定义的
  2. 标记按照正则表达式长度递减的顺序进行排序,然后添加它们(首先添加较长的表达式)。

因此,另一种解决方案是简单地将您希望优先排序的标记指定为函数,而不是字符串,如下所示:

代码语言:javascript
复制
def t_WHILE(t): r'while'; return t
def t_THEN(t): r'then'; return t
t_ID = r'[a-zA-Z_][a-zA-Z0-9_]*'
t_NUMBER = r'\d+'
t_LESSEQUAL = r'<='
t_ASSIGN = r'='
t_ignore = ' \t'

通过这种方式,WHILE和THEN将是第一个添加的规则,您将获得预期的行为。

顺便说一句,您对t_ignore使用了r' \t' (原始字符串),因此Python会将\视为反斜杠。它应该是一个简单的字符串,如上例所示。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5022129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档