语法是一种类似香料的语言识别器

时间:2014-03-27 20:37:26

标签: parsing antlr grammar antlr3

我正在尝试使用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 个答案:

答案 0 :(得分:0)

问题1

词霸不会"听"到解析器。词法分析器只创建包含尽可能多的字符的标记。如果两个令牌匹配相同数量的字符,则首先定义的令牌将" win"。换句话说,"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

问题2

让评论与换行符匹配:

COMMENT :   '%' ~('\r' | '\n')*;

其中~('\r' | '\n')*匹配除换行符之外的零个或多个字符。

相关问题