parsing - 左结合运算符的 BNF 语法

标签 parsing grammar bnf ebnf associativity

我有以下 EBNF 带有左结合运算符的简单算术表达式的语法:

expression:
    term {+ term}
    
term:
    factor {* factor}
    
factor:
    number
    ( expression )
我怎样才能把它转换成 BNF 不改变运算符结合性的语法?以下 BNF 语法对我不起作用,因为现在运算符已成为右结合:
expression:
    term
    term + expression
    
term:
    factor
    factor * term
    
factor:
    number
    ( expression )
维基百科说:

Several solutions are:

  1. rewrite the grammar to be left recursive, or
  2. rewrite the grammar with more nonterminals to force the correct precedence/associativity, or
  3. if using YACC or Bison, there are operator declarations, %left, %right and %nonassoc, which tell the parser generator which associativity to force.

但是它没有说如何重写语法,我也没有使用任何像 YACC 或 Bison 这样的解析工具,只是简单的递归下降。我所要求的甚至可能吗?

最佳答案

expression
    : term 
    | expression + term;

就这么简单。当然,您将需要一个具有某种描述的 LR 解析器来识别左递归文法。或者,如果递归下降,识别这样的语法是可能的,但不像右结合语法那么简单。您必须滚动一个小的递归上升解析器来匹配它。
Expression ParseExpr() {
    Expression term = ParseTerm();
    while(next_token_is_plus()) {
        consume_token();
        Term next = ParseTerm();
        term = PlusExpression(term, next);
    }
    return term;
}

此伪代码应识别该样式的左递归语法。

关于parsing - 左结合运算符的 BNF 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11433047/

相关文章:

c++ - 如何使用 boost::spirit 验证代数语句?

json - 如何使用python3解析嵌套的json数据文件并将其插入sqlite数据库

parsing - 在词法输入序列时指定文字的字符名称是什么?

c# - 给定 BNF 语法输出 C# 的解析器生成器?

python html解析器不返回链接

parsing - 如何将 ANTLR 语法文件拆分为多个文件

java - 如何在java中使用sphinx和freetts管理hello.gram以进行对话

c++ - 使用 BNF 语法提取信息

antlr - 从 DSL 语法文件生成 java 类

java - 如何将其解析为多值映射?