Parsing spice类语言识别器的语法

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手册,但不知道如何解

我正在尝试使用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')*
匹配零个或多个字符,而不是换行字符