【问题标题】:Handling iteration count fields in a parser generator在解析器生成器中处理迭代计数字段
【发布时间】:2012-04-19 19:13:32
【问题描述】:
在典型的解析器生成器情况(例如 ANTLR 或 Beaver)中,如何处理以下情况:
0051A2B3C4D5E
0031G2T3H
它是一个 3 字符的数字字段,告诉您重复字段的迭代次数。
我知道有后处理的可能性,但在某些情况下不会有用,所以我试图找出解析器是否有某种方法来处理它。如果有一个解决方案涉及在解析器读取数字字段时与解析器进行交互 - 以某种方式告诉它根据某个产生式读取下一个 N 项。
【问题讨论】:
标签:
java
parser-generator
【解决方案1】:
这是否可能取决于解析器生成器。
您的词法分析器需要了解其周围环境(上下文相关)。您只想在一行的开头创建一个Num 令牌。在 ANTLR 中,您可以通过在 Num 规则前面添加谓词 getCharPositionInLine()==0 来做到这一点。
然后在您的解析器规则line 中,只要计数器大于零(计数器是Num 的值),您就需要继续使用Block 令牌(您的双字符)。
一个快速的 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
如下: