为什么ANTLR不尊重格拉默顺序?

  • 本文关键字:顺序 ANTLR antlr4
  • 更新时间 :
  • 英文 :


在我的语法中,我有

zLine
: Z fahrtnummer verwaltung takanzahl? taktZeitInMinuten? COMMENT ANYTHING NL
;
fahrtnummer
: INT
;
verwaltung
: ASCII
;

对于这样的输入行

*Z 00006 003849                                           % 00006 003849    00

003849被认为是INT而不是ASCII。如果我在词法分析器中更改INT和 ASCII 的顺序,一切都被识别为ASCII这是错误的 eiter。如何使 ANTLr 遵守解析器给出的顺序?

完整语法

grammar FPLAN3;
fplan
: zLine*;
zLine
: Z fahrtnummer verwaltung takanzahl? taktZeitInMinuten? COMMENT ANYTHING NL
;
fahrtnummer
: INT
;
verwaltung
: ASCII
;
takanzahl
: INT
;
taktZeitInMinuten
: INT
;
Z: '*Z';
INT: [0-9]+;
ASCII: [0-9a-zA-Z]+;
//ASCII: [P{Cc}P{Cn}P{Cs}]+;
COMMENT: '%';
ANYTHING: .*?;
NL: 'r'? 'n' | 'r';
IGNORE_SPACE
: [ ] -> skip
;

输入文件

*Z 00006 003849                                           % 00006 003849    00
*Z 00007 003849                                           % 00007 003849    00
*Z 00008 003849                                           % 00008 003849    00

试验台输出

[@0,0:1='*Z',<'*Z'>,1:0]
[@1,3:7='00006',<INT>,1:3]
[@2,9:14='003849',<INT>,1:9]
[@3,58:58='%',<'%'>,1:58]
[@4,60:64='00006',<INT>,1:60]
[@5,66:71='003849',<INT>,1:66]
[@6,76:77='00',<INT>,1:76]
[@7,78:79='rn',<NL>,1:78]
[@8,80:81='*Z',<'*Z'>,2:0]
[@9,83:87='00007',<INT>,2:3]
[@10,89:94='003849',<INT>,2:9]
[@11,138:138='%',<'%'>,2:58]
[@12,140:144='00007',<INT>,2:60]
[@13,146:151='003849',<INT>,2:66]
[@14,156:157='00',<INT>,2:76]
[@15,158:159='rn',<NL>,2:78]
[@16,160:161='*Z',<'*Z'>,3:0]
[@17,163:167='00008',<INT>,3:3]
[@18,169:174='003849',<INT>,3:9]
[@19,218:218='%',<'%'>,3:58]
[@20,220:224='00008',<INT>,3:60]
[@21,226:231='003849',<INT>,3:66]
[@22,236:237='00',<INT>,3:76]
[@23,238:237='<EOF>',<EOF>,3:78]
line 1:9 missing ASCII at '003849'
line 1:60 mismatched input '00006' expecting ANYTHING
line 2:9 missing ASCII at '003849'
line 2:60 mismatched input '00007' expecting ANYTHING
line 3:9 missing ASCII at '003849'
line 3:60 mismatched input '00008' expecting ANYTHING
(fplan (zLine *Z (fahrtnummer 00006) (verwaltung <missing ASCII>) (takanzahl 003849) % 00006 003849 00 rn) (zLine *Z (fahrtnummer 00007) (verwaltung <missing ASCII>) (takanzahl 003849) % 00007 003849 00 rn) (zLine *Z (fahrtnummer 00008) (verwaltung <missing ASCII>) (takanzahl 003849) % 00008 003849 00))

解析器规则对词法分析器规则评估没有影响。

在弹性处理阶段,将根据输入字符流评估所有规则。如果多个规则匹配,则以下内容将发挥作用。

1 - 如果规则匹配较长的输入字符序列,则词法分析器将为该规则生成令牌。 2 - 如果多个规则匹配相同长度的序列,则将使用第一个词法分析器规则来生成令牌。

由于INTASCII都可以匹配数字序列,因此词法分析器将为语法中首先出现的哪个生成一个标记。

请注意,虽然解析器是递归下降的,但它针对令牌流运行,因此在解析器参与之前确定所有令牌。 遵循哪个解析器规则路径并不重要,令牌类型已经确定。 简而言之,词法分析器不能"尊重解析器给出的顺序"。 解析器作用于词法分析器的输出。

相关内容

  • 没有找到相关文章

最新更新