【问题标题】:Antlr4 grammar with basic arithmetic and signed expressions具有基本算术和有符号表达式的 Antlr4 语法
【发布时间】:2014-11-07 14:06:11
【问题描述】:

我正在学习 Antlr4 为基本算术编写语言。目前,我已经为基本算术运算符*+-/编写了一个带有Antlr4的语法。 这是我的语法:

grammar Expr; // rename to distinguish from Expr.g4

prog:   stat (';' stat)* ;

stat:   ID '=' expr (';'|',')?              # assign
    |   expr (';')?                         # printExpr
    ;

expr:   op=('-'|'+') expr                    # signed
    |   expr op=('*'|'/') expr               # MulDiv
    |   expr op=('+'|'-') expr               # AddSub
    |   ID                                   # id                 
    |   DOUBLE                               # Double
    |   '(' expr ')'                         # parens
    ;



MUL :   '*' ; // assigns token name to '*' used above in grammar
DIV :   '/' ;
ADD :   '+' ;
SUB :   '-' ;
ID  :   [a-zA-Z]+ [0-9]* ;      // match identifiers
DOUBLE :   [0-9]+ ('.' [0-9]+)? ;
WS : [ \t\r\n]+ -> skip ;

问题是由于规则:op=('-'|'+') expr,我的语法接受像 2++++3 这样的输入。但是,我没有找到其他实现签名表达式的方法,例如-2 + 3x = 6; y = -x+3 -2

我该如何修复这个错误?

【问题讨论】:

    标签: java math compiler-construction antlr antlr4


    【解决方案1】:

    试着打破你的语法,现在它有点像一个怪物规则(expr)。您可能不想对整个表达式进行签名,而是对单个值进行签名。像这样的东西怎么样

    expr: add value
        | expr mult expr
        | expr add expr
        | value
        ;
    value: ID
         | DOUBLE
         | '(' expr ')'
         ;
    add: '+' | '-';
    mult: '*' | '/';
    

    这样,您可以构建签名表达式,例如 -2+x-(2+3),但不能构建 2++3

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多