1

我的语法文件test.ebnf看起来像,

start = identifier ;

identifier =
  /[a-z]*/ rest;

rest = /[0-9]*/ ;

当我在输入“test1234”中运行此语法时,我希望它产生“test1234”作为单个词素,但 AST 看起来像,

AST:
['test', '1234']

我尝试将nameguard功能设置为 false 运行,但没有运气。我怎样才能在不写规则的情况下获得这种行为identifier = /[a-z]*[0-9]*/

4

1 回答 1

1

Grako将始终在规则的右侧返回一个每个元素一个对象的列表,除非只有一个元素。即使在命名元素时,多个具有相同名称的匹配项也会返回一个列表。仅仅连接元素是不合理的,因为它们的 AST 可能是项目所需的复杂对象。

在您的情况下,您可以使用语义操作来连接这些identifier部分:

def identifier(self, ast):
    return ''.join(ast)

或者重新定义identifier规则以具有单个元素:

identifier
    =
    /[a-z]+[0-9]*|[a-z]*[0-9]+/
    ;

(注意正则表达式的更改,因此它永远不会匹配空字符串)。

于 2015-01-03T11:44:22.310 回答