根据位置 ANTLR4 将一个单词标记为多个标记
Tokenize one word into multiple tokens based on position ANTLR4
我正在为 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?
有什么建议吗?提前致谢
我使用模式解决了这个问题。
匹配链后,我切换到一种模式并处理其中的标识符 (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 ;
我正在为 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?
有什么建议吗?提前致谢
我使用模式解决了这个问题。
匹配链后,我切换到一种模式并处理其中的标识符 (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 ;