我必须用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: