【问题标题】:Grammar for a recognizer of a spice-like language类香料语言识别器的语法
【发布时间】:2014-03-27 20:37:25
【问题描述】:

我正在尝试使用 Antlr-3.1.3 为类似香料的语言的识别器构建语法(由于 Python 目标,我使用此版本)。我没有使用解析器的经验。我找到了一篇硕士论文,学生已经完成了 SPICE 2G6 语言的句法分析,并使用 LEX 和 YACC 编译器编写工具构建了一个解析器。 (http://digitool.library.mcgill.ca/R/?func=dbin-jump-full&object_id=60667&local_base=GEN01-MCG02) 在第 4 章中,他以 Backus-Naur 形式描述了 SPICE 2G6 语言的语法,并将解析器的 LEX 和 YACC 代码文件附加到工作中。

我的工作立足于为限制性更强的香料语言的识别器创建更简单的语法。

我阅读了 Antlr 手册,但不知道如何解决以下代码 sn-p 说明的两个问题。

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) 一行代码的结尾。当我在一行代码的末尾包含注释时,解析器需要两个换行符才能正确识别该代码行,否则只需要一个换行符。我该如何改进?

谢谢!

【问题讨论】:

    标签: parsing antlr grammar antlr3


    【解决方案1】:

    问题 1

    词法分析器不“听”解析器。词法分析器只是创建包含尽可能多字符的标记。如果两个标记匹配相同数量的字符,则首先定义的标记将“获胜”。换句话说,"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,并从REAL 中删除了fragment

    问题 2

    不要让注释匹配换行符:

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

    其中~('\r' | '\n')* 匹配零个或多个字符而不是换行符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多