【发布时间】:2014-03-27 20:37:25
【问题描述】:
我正在尝试使用 Antlr-3.1.3 为类似香料的语言的识别器构建语法(由于 Python 目标,我使用此版本)。我没有使用解析器的经验。我找到了一篇硕士论文,学生已经完成了 SPICE 2G6 语言的句法分析,并使用 LEX 和 YACC 编译器编写工具构建了一个解析器。 (http://digitool.library.mcgill.ca/R/?func=dbin-jump-full&object_id=60667&local_base=GEN01-MCG02) 在第 4 章中,他以 Backus-Naur 形式描述了 SPICE 2G6 语言的语法,并将解析器的 LEX 和 YACC 代码文件附加到工作中。
我的工作立足于为限制性更强的香料语言的识别器创建更简单的语法。
我阅读了 Antlr 手册,但不知道如何解决以下代码 sn-p 说明的两个问题。
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) 一行代码的结尾。当我在一行代码的末尾包含注释时,解析器需要两个换行符才能正确识别该代码行,否则只需要一个换行符。我该如何改进?
谢谢!
【问题讨论】:
标签: parsing antlr grammar antlr3