【发布时间】:2016-12-22 11:49:49
【问题描述】:
您好,我是 antrl 的新手,最近几天遇到了一个我无法解决的问题:
我想写一个识别这个文本的语法(实际上我想解析一些不同的东西,但是对于这个问题我简化了它)
100abc
150100
200def
这里每行以 3 位数字开头,用于标识行的类型(标题、内容、结尾),后面的 3 个字符是行的有效负载。
我想我可以用这个语法来识别这个:
grammar Types;
file : header content trailer;
A : [a-z|A-Z|0-9];
NL: '\n';
header : '100' A A A NL;
content: '150' A A A NL;
trailer: '200' A A A NL;
但这不起作用。当词法分析器在第二行(“150100”)中读取“100”时,它会将其读入 one 标记,其中 100 作为值而不是三个 A 类型的标记。因此解析器看到“ 100" 令牌,它需要一个 A 令牌。
我很确定这是因为 Lexer 想要匹配一个 Token 的最长短语,因此它将“1”、“0”、“0”聚集在一起。我发现没有办法解决这个问题。将规则 A 放在包含字符串文字“100”的解析器规则上方不起作用。并且如下将“100”分解为一个片段也不起作用。
grammar Types;
file : header content trailer;
A : [a-z|A-Z|0-9];
NL: '\n';
HUNDRED: '100';
header : HUNDRED A A A NL;
content: '150' A A A NL;
trailer: '200' A A A NL;
我还阅读了一些其他类似的帖子:
antlr4 mixed fragments in tokens
Lexer, overlapping rule, but want the shorter match
但我不认为它解决了我的问题,或者至少我不知道这对我有什么帮助。
【问题讨论】:
标签: antlr4