我正在为 RPG 2 编写解析器。RPG 2 是基于位置的,我使用谓词来实现这一点。但是,有一个地方我被卡住了。
RPG中的一句话就像
26 C N20 'PICK' CHAINORDOFIL 09
在这里,CHAIN从位置27到32,ORDOFIL从33到41。
我匹配链和以下标识符的规则就像
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?
有什么建议吗?提前致谢
我能够通过使用模式来解决这个问题。
一旦我匹配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 ;