Parsing spice类语言识别器的语法
我正在尝试使用Antlr-3.1.3为类似spice的语言的识别器构建语法(我使用这个版本是因为Python目标)。我没有解析器方面的经验。我发现了一篇硕士论文,学生对SPICE 2G6语言进行了语法分析,并使用LEX和YACC编译器编写工具构建了解析器。()在第4章中,他描述了SPICE 2G6语言的Backus-Naur形式的语法,并将解析器的LEX和YACC代码文件附加到工作中 我以这项工作为基础,为更严格的spice语言的识别者创建一个更简单的语法 我阅读了Antlr手册,但不知道如何解决下面的代码片段说明的两个问题Parsing spice类语言识别器的语法,parsing,antlr,grammar,antlr3,Parsing,Antlr,Grammar,Antlr3,我正在尝试使用Antlr-3.1.3为类似spice的语言的识别器构建语法(我使用这个版本是因为Python目标)。我没有解析器方面的经验。我发现了一篇硕士论文,学生对SPICE 2G6语言进行了语法分析,并使用LEX和YACC编译器编写工具构建了解析器。()在第4章中,他描述了SPICE 2G6语言的Backus-Naur形式的语法,并将解析器的LEX和YACC代码文件附加到工作中 我以这项工作为基础,为更严格的spice语言的识别者创建一个更简单的语法 我阅读了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
在上面的语法中,令牌节点是由值令牌表示的集合的子集。语法正确地解释了像“R1 5 0 1.1/n”这样的输入,但不能解释像“R1 5 0 1/n”这样的输入,因为它将“1”映射到令牌节点,而不是映射到令牌值,因为节点位于令牌部分中的值之前。有了这样的输入,有没有人知道如何将“1”映射到正确的标记值,或者建议如何修改语法以便正确解释输入
第二个问题是在一行末尾出现注释。因为换行符限定:(1)注释的结尾;(2)一行代码的末尾。当我在一行代码的末尾添加注释时,解析器需要两个换行符才能正确识别代码行,否则只需要一个换行符。我该如何改进这一点
谢谢 问题1
lexer不“监听”解析器。lexer只是创建包含尽可能多的字符的标记。如果两个令牌匹配相同数量的字符,则首先定义的令牌将“赢”。换句话说,“1”
将始终标记为节点
,即使解析器试图匹配值
您可以这样做:
resistor
: RES NODE NODE value 'G2'? COMMENT? NEWLINE
;
value : NODE | REAL;
// START:tokens
RES : ('R'|'r') DIG+;
NODE : DIG+;
REAL : (DIG+ EXP?) | (FLT EXP?);
...
例如,我从REAL
问题2
不要让注释与换行符匹配:
COMMENT : '%' ~('\r' | '\n')*;
其中~('\r'|'\n')*
匹配零个或多个字符,而不是换行字符