用于识别香料的语法

我正在尝试为使用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')*匹配换行符以外的零个或多个字符。

链接地址: http://www.djcxy.com/p/43709.html

上一篇: Grammar for a recognizer of a spice

下一篇: Mapping ANTLR parse rules to custom Java AST classes for code generation