繁体   English   中英

表达式解析器语法和左关联性

[英]Expression parser grammar and left-associativity

我一直在尝试用变量创建我的解析器表达式,并将它们简化为二次表达式。

这是我的解析器语法:

Exercise : Expr '=' Expr
Expr : Term [+-] Expr | Term
Term : Factor [*/] Term | Factor
Factor: Atom [^] Factor | Atom
Atom: Number | Identified | [- sqrt] Atom | '(' Expr ')'

对于解析我正在使用递归下降解析器。 我想说我想解析一下:

“2 - 1 + 1 = 0”

结果为0,解析器创建错误的树:

  -
 / \
2   +
   / \
  1   1

我怎样才能使这个语法保持联想? 我是新手,请你告诉我哪里可以找到更多信息? 我可以用递归下降解析器实现这一点吗?

看看Theodore Norvell的递归下降解析表达式

在那里,他提出了三种解决问题的方法。
1. 调车场算法。
2.通过分解语法的经典解决方案
3. 优先攀登

你的问题源于你的语法需要多次改变,一个例子就是

Exrp:Term {[+ - ] Expr} | 术语

注意在[+-] Expr周围添加{ }表示它们应该被一起解析,并且可以有0个或更多。

此外,默认情况下,您将树构建为

  -
 / \
2   +
   / \
  1   1

-(2,+(1,1))

当你应该为具有相同优先级的左关联运算符构建树时

     +
    / \
   -   1
  / \
 2   1

+(-(2,1),1)

由于本文有三种方法可以做到这一点,所以我不会在这里进行扩展。 另外你提到你是新手,所以你应该得到一本好的编译器书,以了解你将在阅读论文时遇到的细节。 这些方法中的大多数都是以通用编程语言实现的,并且可以在互联网上免费获得,但要注意许多人会做你做的事情并发布错误的结果。

检查你是否正确的最佳方法是使用多个减法操作序列进行这样的测试:

7-3-2 = 2

如果你得到

7-3-2 = 6或其他

那是错的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM