如何使用Antlr4停用令牌

问题描述 投票:1回答:1

我必须用antlr4解析一个由许多数据块组成的文本文件,每个数据块都有一个数据块标题(一行)和数个DataRows(1 .. *)行。

[数据块标题总是在该行的第一个位置以'1'开始加星号,随后是几个字母数字字段。

DataRow也由字母数字字段(dataFields)组成,字符'1'可以是第一个dataField,但绝不能位于该行的第一位置。

这是要分析的输入的示例:

1   DataHeaderField1 datafield2 DataBlock1
    DB1_Row1_F1 DB1_Row1_F2    DB1_Row1_F3  DataBlock1
    DB1_Row2_F1 DB1_Row2_F2    DB1_Row2_F3  DataBlock1

1   DataHeaderField1 datafield2 DataBlock2
    DB2_Row1_F1 DB2_Row1_F2    DB2_Row1_F3  DataBlock2
    DB2_Row2_F1 DB2_Row2_F2    DB2_Row2_F3  DataBlock2
    DB2_Row3_F1 DB2_Row3_F2    DB2_Row3_F3  DataBlock2

....

我尝试过的语法是:

grammar ReadDataBlocks;
start_parsing: dataBlock+ EOF;
dataBlock: commonHeader  row+;
commonHeader: ONE_AT_FIRST_POS APLHANUMERIC* NL ;
row: APLHANUMERIC+ NL;

ONE_AT_FIRST_POS:   '1' {getCharPositionInLine() == 1}?;

APLHANUMERIC : (LETTER
                |
                DIGIT)+;
DIGIT: [0-9];
LETTER: [a-zA-Z];
NL: '\r'? '\n';
ESPACES : [ \t]+ -> skip;

为了解析文件,如语法所示,我已在词法分析器中停用了令牌,方法是在DIGIT令牌之前指定令牌ONE_AT_FIRST,因此在任何时候在第一个位置检测到'1'都不得解析为DIGIT。

问题是,当解析器通过位于任何其他位置的'1'运行时,仍会抛出以下消息而标识为ONE_AT_FIRST_POS:

Output from IntelliJ Idea Antlr plugin

java antlr4 dsl
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.