【发布时间】:2018-02-01 02:41:00
【问题描述】:
我有一个简单的语法,最终会解析 YANG 源。当我做出似乎是任意更改 MODULE 令牌的位置时,IntelliJ ANTLR4 插件可以/无法解析我的输入。
要解析的输入字符串:
module x { }
这是没有任何错误的语法:
grammar Yang ;
yang: module_open module_close;
module_open : MODULE ID BRACKET_OPEN ;
module_close: BRACKET_CLOSE ;
MODULE: 'module' ;
ID: ([A-Za-z][A-Za-z0-9_-]*) ;
BRACKET_OPEN: '{' ;
BRACKET_CLOSE: '}' ;
WS: [ \t\r\n]+ -> skip ;
下面是失败的语法:
grammar Yang ;
yang: module_open module_close;
module_open : MODULE ID BRACKET_OPEN ;
module_close: BRACKET_CLOSE ;
ID: ([A-Za-z][A-Za-z0-9_-]*) ;
MODULE: 'module' ;
BRACKET_OPEN: '{' ;
BRACKET_CLOSE: '}' ;
WS: [ \t\r\n]+ -> skip ;
我所做的只是在 ID 令牌之前/之后剪切粘贴 MODULE 令牌定义,如果 MODULE 定义在 ID 定义之后,它总是会失败。
我错过了什么?我在文档中没有看到关于令牌顺序的讨论!
编辑:@BartKiers 相关帖子...ANTLR4 lexer rules don't work as expected
【问题讨论】:
-
@BartKiers 这个答案只承认了问题:订购代币的具体规则是什么?我不明白为什么什么相当于一个简单的替换(.aka. MODULE ->“模块”)应该服从声明的顺序。如果可能,请在文档中引用参考资料。
-
@BartKiers 首先,感谢您回答新问题的努力!我得到“词法分析器尝试匹配尽可能多的字符”部分。但我不明白为什么“当 2 个(或更多)规则匹配相同数量的字符时,首先定义的规则将获胜。”甚至适用于这种情况...我只有一个 MODULE 令牌定义和一个使用该定义的规则“module_open”。”
-
@BartKiers 我能回答我自己的问题最接近的是“令牌定义必须按照它们在解析树中的使用顺序声明。”或类似的东西......但是如果我在另一个解析规则中以不同的顺序使用它们呢?
-
“首先,感谢您的努力回答......”:没问题。 “......它们在解析树中的使用顺序。”不,这不是它的工作原理。由于您不清楚我的答案,我将重新打开您的问题并删除链接。也许其他人能够解释它。
标签: parsing intellij-idea token antlr4