【发布时间】:2019-05-20 05:40:34
【问题描述】:
我正在构建一种新的简单编程语言(只是为了在空闲时间了解编译器的工作原理)。
我已经构建了一个词法分析器,可以将我的源代码标记为词法。
但是,我现在被困在如何从标记中形成抽象语法树,其中源代码可能包含表达式(具有运算符优先级)。
为简单起见,我将仅包括 4 个基本运算符:+、-、/ 和 * 以及括号 ()。运算符优先级将遵循 BODMAS 规则。
我意识到我可以将表达式从中缀转换为前缀/后缀,形成树并替换它。
但是,我不确定这是否可能。即使有可能,我也不确定它的效率或实施难度。
是否有一些简单的方法可以就地形成树而不必先转换为前缀/后缀?
我遇到了似乎可以做到这一点的 Shutting Yard 算法。但是,我发现它是一个相当复杂的算法。有没有更简单的方法,还是我应该继续实施 Shutting Yard 算法?
目前,我的词法分析器将以下程序标记为如下:
我正在演示使用 Java 程序来熟悉语法。
源程序:
public class Hello
{
public static void main(String[] args)
{
int a = 5;
int b = 6;
int c = 7;
int r = a + b * c;
System.out.println(r);
}
}
词法分析器输出:
public
class
Hello
{
public
static
void
main
(
String
[
]
args
)
{
int
a
=
5
;
int
b
=
6
;
int
c
=
7
;
int
r
=
a
+
b
*
c
;
System
.
out
.
println
(
r
)
;
}
}
【问题讨论】:
-
调车场算法如果你用它来做表达式真的很简单;如果它看起来并不简单,那么你可能做错了。 :-) 如果你的语言足够简单,你可以在整个解析中使用它,但这已经不是很常见了。
-
@rici 好的。我想我应该再试一次 Shutting Yard 算法。谢谢。
-
@rici 另外,您的意思是说,Shunting Yard 算法是我场景中解析表达式的最佳和最有效的方法吗?
-
@pratanu:我不是这么说的,不。它不一定是最快或最有效的;这取决于你如何实现它。但它很容易编写,因此在程序员的时间里效率很高。一旦你理解了这个工具,像野牛这样的解析器生成器几乎肯定会更快,并且可能更容易编码,但还有更多需要学习。
标签: parsing compiler-construction abstract-syntax-tree lexer