首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PLY解析令牌

用PLY解析令牌
EN

Stack Overflow用户
提问于 2015-05-08 07:19:59
回答 1查看 654关注 0票数 2

一段时间以来,我一直在尝试解析一些给定的文本,但是我还没有弄清楚。我定义了这些令牌:

代码语言:javascript
复制
tokens = ['ID', 'INT', 'ASSIGNMENT'] 

我想把我找到的单词归类到这些标记中。例如,如果给出了扫描仪:

代码语言:javascript
复制
var = 5

它应该打印如下:

代码语言:javascript
复制
ID : 'var'
ASSIGNMENT : '='
INT : 5

这个很好用。问题是当程序被赋予以下文本时:

代码语言:javascript
复制
9var = 5

这方面的产出如下:

代码语言:javascript
复制
INT : 9
ID : 'var'
ASSIGNMENT : '='
INT : 5

这就是它出错的地方。它应该以9var作为ID,并且根据ID regex,这不是ID的有效名称。

代码语言:javascript
复制
def t_ID(t):
    r'[a-zA-Z_][a-zA-Z_0-9]*' 
    return t

def t_INT(t):
    r'\d+'
    t.value = int(t.value)
    return t

t_ASSIGNMENT = r'\='

我怎么才能解决这个问题?

您的帮助将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-08 17:04:45

您说:“它应该以9var作为ID”。但是您可以指出,9var与ID regex模式不匹配。那么,为什么要扫描9var作为ID呢?

如果您希望9var是一个ID,就可以很容易地将正则表达式从[a-zA-Z_][a-zA-Z_0-9]*更改为[a-zA-Z_0-9]+。(这也将匹配纯整数,因此您需要确保首先应用INT模式。或者,您可以使用[a-zA-Z_0-9]*[a-zA-Z_][a-zA-Z_0-9]*。)

我怀疑您真正想要的是将9var识别为词汇错误,而不是解析错误。但是,如果它在任何情况下都被认为是一个错误,那么它是词汇错误还是语法错误真的很重要吗?

值得一提的是,Python的工作方式与您的lexer完全相同:它将9var扫描为两个标记,这将在稍后创建一个语法错误。

当然,在您的语言中,有可能有一些语法正确的结构,其中ID可以直接跟随INT。或者,如果不是,关键字可以直接跟随一个INT,比如3 if x else 2。(同样,如果你把它写成3if x else 2,Python不会抱怨。)

因此,如果您真的坚持标记以数字开头并以非数字继续的令牌的扫描器错误,则可以插入另一个模式,如[0-9]+[a-zA-Z_][a-zA-Z_0-9]*,并让它在其操作中引发错误。

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

https://stackoverflow.com/questions/30118046

复制
相关文章

相似问题

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