gpt4 book ai didi

antlr - 这个语法有什么问题?

转载 作者:行者123 更新时间:2023-12-01 00:05:19 24 4
gpt4 key购买 nike

grammar Test;

IDHEAD: ('a'..'z' | 'A'..'Z' | '_');
IDTAIL: (IDHEAD | '0'..'9');
ID: (IDHEAD IDTAIL*);
fragment
TYPE: ('text' | 'number' | 'bool');

define: 'define' ID 'as' TYPE;

问题在于 define规则匹配 token define , ID , as ,但不会匹配 TYPE .我正在产生一个 MissingTokenException。

如果我内联 TYPE,如下所示,它将按我的意图工作:
grammar Test;

IDHEAD: ('a'..'z' | 'A'..'Z' | '_');
IDTAIL: (IDHEAD | '0'..'9');
ID: (IDHEAD IDTAIL*);
fragment
TYPE: ('text' | 'number' | 'bool');

define: 'define' ID 'as' ('text' | 'number' | 'bool');

更新: fragment添加关键字是为了解决另一个冲突: The following token definitions can never be matched because prior tokens match the same input: TYPE .

最佳答案

在组合语法中,将解析器规则置于词法分析器规则之上。另外,请记住词法分析器首先运行,并且只有在解析器完成后才运行。 TYPE (lexer) 标记必须在知道 define 之前匹配(解析器)规则需要它。

片段词法分析器规则不创建标记,但它们可以组合成创建标记的非片段规则。在您的示例中,IDHEADIDTAIL不是标记 - 它们仅用于描述 ID 的部分.因此,TYPEID是您的非片段规则,以及 IDHEADIDTAIL是片段规则。

grammar Test;

define: 'define' ID 'as' TYPE;

/*
* Lexer rules only below here
*/

TYPE: ('text' | 'number' | 'bool');
ID: (IDHEAD IDTAIL*);

fragment
IDHEAD: ('a'..'z' | 'A'..'Z' | '_');

fragment
IDTAIL: (IDHEAD | '0'..'9');

关于antlr - 这个语法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1694511/

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