parsing - 赋值为 Antlr 语法中的表达式

标签 parsing antlr ll

我正在尝试扩展 the grammar of the Tiny Language将赋值视为表达式。因此,写是有效的

a = b = 1; // -> a = (b = 1)
a = 2 * (b = 1); // contrived but valid
a = 1 = 2; // invalid

赋值在两个方面不同于其他运算符。它是右结合的(没什么大不了的),它的左侧必须是一个变量。所以我改变了这样的语法
statement: assignmentExpr | functionCall ...;

assignmentExpr: Identifier indexes? '=' expression;

expression: assignmentExpr | condExpr;

它不起作用,因为它包含一个非 LL(*) 决定。我也试过这个变种:
assignmentExpr: Identifier indexes? '=' (expression | condExpr);

但我遇到了同样的错误。我对感兴趣
  • 这个具体问题
  • 给定一个非 LL(*) 决策的文法,如何找到导致问题的两条路径
  • 如何修复
  • 最佳答案

    我认为您可以像这样更改语法以实现相同的目的,而无需使用句法谓词:

    statement: Expr ';' | functionCall ';'...;
    
    Expr: Identifier indexes? '=' Expr  |  condExpr ;
    
    condExpr: .... and so on;
    

    考虑到这个想法,我改变了 Bart 的例子:
    grammar TL;
    
    options {
      output=AST;
    }
    
    tokens {
      ROOT;
    }
    
    parse
      :  stat+ EOF -> ^(ROOT stat+)
      ;
    
    stat
      :  expr ';' 
      ;
    
    expr
      : Id Assign expr -> ^(Assign Id expr)
    
      | add
      ;
    
    add
      :  mult (('+' | '-')^ mult)*
      ;
    
    mult
      :  atom (('*' | '/')^ atom)*
      ;
    
    atom
      :  Id
      |  Num
      |  '('! expr ')' !
      ;
    
    Assign  :   '=' ;
    Comment : '//' ~('\r' | '\n')* {skip();};
    Id      : 'a'..'z'+;
    Num     : '0'..'9'+;
    Space   : (' ' | '\t' | '\r' | '\n')+ {skip();};
    

    对于输入:
    a=b=4;
    a = 2 * (b = 1);
    

    你得到以下解析树:
    enter image description here

    关于parsing - 赋值为 Antlr 语法中的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8398686/

    相关文章:

    c++ - 为什么在尝试推送到 vector 时会出现 std::bad_alloc 错误?

    java - 如何使用在另一个类中声明的变量?

    php - PHP 中相关值的 HTML 解析

    Android - 从网站解析文本

    java - Antlr4浮点解析

    java - 简单的 ANTLR 错误

    compiler-construction - LL(1) 是哪些当代计算机语言?

    parsing - LL(1) 解析器中 FIRST 和 FOLLOW 集的目的?

    java - 岛语法antlr3