我正在为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?
有什么建议吗?提前致谢
答案 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 ;