在典型的解析器生成器情况下(例如ANTLR或Beaver),如何处理以下情况:
0051A2B3C4D5E
0031G2T3H
它是一个3个字符的数字字段,它告诉您重复字段之后经过了多少次迭代。
我知道可以进行后期处理,但是在某些情况下不会有用,因此我试图寻找解析器是否有某种处理方式。如果有一种解决方案涉及在解析器读取数字字段时与解析器进行交互,则可以接受-以某种方式告诉解析器在接下来的N个项目中继续读取。
最佳答案
是否可行取决于解析器生成器。
您的词法分析器将需要了解其周围环境(上下文相关)。您只想在行首创建Num
令牌。在ANTLR中,您可以通过在getCharPositionInLine()==0
规则前面添加谓词Num
来实现。
然后在解析器规则line
中,只要计数器大于零(计数器为Block
的值),就需要继续消耗Num
令牌(您的双字符)。
ANTLR快速演示:
grammar T;
parse
: line* EOF
;
line
@init{int n = 0;}
: Num {n = Integer.valueOf($Num.text);} ({n > 0}?=> Block {n--;})*
;
Num
: {getCharPositionInLine()==0}?=> Digit Digit Digit
;
Block
: AlphaNum AlphaNum
;
Space
: (' ' | '\t' | '\r' | '\n')+ {skip();}
;
fragment Digit : '0'..'9';
fragment Letter : 'a'..'z' | 'A'..'Z';
fragment AlphaNum : Letter | Digit;
会解析您的输入:
0051A2B3C4D5E
0031G2T3H
如下: