我正在尝试使用Antlr-3.1.3为类似spice的语言的识别器构建语法(由于Python目标,我使用此版本)。我没有解析器的经验。我找到了一篇硕士论文,学生对SPICE 2G6语言进行了语法分析,并使用LEX和YACC编译器编写工具构建了一个解析器。 (http://digitool.library.mcgill.ca/R/?func=dbin-jump-full&object_id=60667&local_base=GEN01-MCG02)在第4章中,他描述了用于SPICE 2G6语言的Backus-Naur形式的语法,并将解析器的LEX和YACC代码文件附加到工作中。
我正在做这项工作,为更严格的香料语言的识别器创建一个更简单的语法。
我阅读了Antlr手册,但无法弄清楚如何解决两个问题,下面的代码片段说明了这一点。
grammar Najm_teste;
resistor
: RES NODE NODE VALUE 'G2'? COMMENT? NEWLINE
;
// START:tokens
RES : ('R'|'r') DIG+;
NODE : DIG+; // non-negative integer
VALUE : REAL; // non-negative real
fragment
SIG : '+'|'-';
fragment
DIG : '0'..'9';
fragment
EXP : ('E'|'e') SIG? DIG+;
fragment
FLT : (DIG+ '.' DIG+)|('.' DIG+)|(DIG+ '.');
fragment
REAL : (DIG+ EXP?)|(FLT EXP?);
COMMENT : '%' ( options {greedy=false;} : . )* NEWLINE;
NEWLINE : '\r'? '\n';
WS : (' '|'\t')+ {$channel=HIDDEN;};
// END:tokens
在上面的语法中,令牌NODE是VALUE令牌所代表的集合的子集。语法正确解释输入,如“R1 5 0 1.1 / n”,但不能解释像“R1 5 0 1 / n”这样的输入,因为它将“1”映射到令牌NODE,而不是将其映射到令牌VALUE ,因为NODE在令牌部分中位于VALUE之前。鉴于此类输入,是否有人知道如何将“1”映射到正确的标记VALUE,或者如何更改语法以便我能正确解释输入?
第二个问题是在一行结尾处存在评论。因为NEWLINE标记分隔:(1)注释的结束; (2)代码行的结尾。当我在一行代码的末尾包含注释时,解析器需要两个换行符才能正确识别代码行,否则只需要一个换行符。我怎么能改善这个?
谢谢!
答案 0 :(得分:0)
"1"
将始终标记为NODE
,即使解析器正在尝试匹配VALUE
。
你可以这样做:
resistor
: RES NODE NODE value 'G2'? COMMENT? NEWLINE
;
value : NODE | REAL;
// START:tokens
RES : ('R'|'r') DIG+;
NODE : DIG+;
REAL : (DIG+ EXP?) | (FLT EXP?);
...
例如,我删除了VALUE
,添加了value
并从fragment
REAL
不让评论与换行符匹配:
COMMENT : '%' ~('\r' | '\n')*;
其中~('\r' | '\n')*
匹配除换行符之外的零个或多个字符。