一段时间以来,我一直在尝试解析一些给定的文本,但是我还没有弄清楚。我定义了这些令牌:
tokens = ['ID', 'INT', 'ASSIGNMENT'] 我想把我找到的单词归类到这些标记中。例如,如果给出了扫描仪:
var = 5它应该打印如下:
ID : 'var'
ASSIGNMENT : '='
INT : 5这个很好用。问题是当程序被赋予以下文本时:
9var = 5这方面的产出如下:
INT : 9
ID : 'var'
ASSIGNMENT : '='
INT : 5这就是它出错的地方。它应该以9var作为ID,并且根据ID regex,这不是ID的有效名称。
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'\='我怎么才能解决这个问题?
您的帮助将不胜感激!
发布于 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]*,并让它在其操作中引发错误。
https://stackoverflow.com/questions/30118046
复制相似问题