基于位置ANTLR4将一个单词标记为多个标记

时间:2017-07-25 07:19:45

标签: parsing antlr antlr4 lexer

我正在为RPG 2编写解析器.RPG 2是基于位置的,我使用谓词来实现这一点。但是有一个地方我被卡住了。

RPG中的一个声明就像

  26 C  N20      'PICK'    CHAINORDOFIL              09

此处CHAIN从第27位到第32位,ORDOFIL从33位跨越到41位。

我匹配Chain和后面的标识符的规则就像

CALCULATION_OPERATIONS_CHAIN : CHAIN_T  {(getCharPositionInLine()>=27) &&(getCharPositionInLine()<=32)}? ->type(CHAIN_T);

CALCULATION_FACTOR2_1:  IDENT_T  {(getCharPositionInLine()>=33) && (getCharPositionInLine()<=42)}?   ->type(IDENT_T);

但我的问题是“CHAINORDOFIL”在第二条规则中匹配(作为IDENT_T)。

如何匹配第一个规则中的CHAIN和第二个规则中的ORDOFIL?

有什么建议吗?提前致谢

1 个答案:

答案 0 :(得分:0)

我能够通过使用模式来解决这个问题。

一旦我匹配CHAIN,我就切换到一种模式并处理那里的标识符(ORDOFIL)。

规则就是这样

CALCULATION_OPERATIONS_CHAIN : CHAIN_T  {(getCharPositionInLine()>=27) && (getCharPositionInLine()<=32)}? ->type(CHAIN_T),pushMode(CHAIN);

mode CHAIN;
CHAIN_WHITESPACE_T : ' ' ->skip;
CHAIN_FACTOR2_1: IDENT_T {(getCharPositionInLine()>=33) && (getCharPositionInLine()<=42)}?  ->type(IDENT_T);
CHAIN_ENDLINE : NEWLINE -> type(EOL),popMode,popMode ;