gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:40:56 26 4
gpt4 key购买 nike

我正在尝试扩展 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com