用于识别香料的语法
我正在尝试为使用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)一行代码的结尾。 当我在一行代码的末尾添加注释时,解析器需要两个换行符正确识别代码行,否则只需要一个换行符。 我怎么能改善这个?
谢谢!
问题1
词法分析器不“听”分析器。 词法分析器只创建包含尽可能多字符的标记。 在两个令牌匹配相同数量的字符的情况下,首先定义的令牌将“赢”。 换句话说,即使解析器试图匹配VALUE
, "1"
也会始终被标记为NODE
。
你可以这样做:
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
并从REAL
删除了fragment
问题2
不要让评论匹配换行符:
COMMENT : '%' ~('r' | 'n')*;
其中~('r' | 'n')*
匹配换行符以外的零个或多个字符。
上一篇: Grammar for a recognizer of a spice
下一篇: Mapping ANTLR parse rules to custom Java AST classes for code generation