【发布时间】:2017-10-23 13:41:25
【问题描述】:
假设我们有一个简单的语法:
- 程序 ::= 表达式
- 表达式 ::= 数字
- ::= - ( 表达式 , 表达式 )
使用这个表达式:-(-(8,3)4)
返回 1。
我的令牌流(我将括号和逗号拼接出来)看起来像这样
(减号 -)
(减号 -)
(整数 8)
(整数 3)
(整数 4)
所以 AST 看起来像这样
. . -
. - 。 4
8..3
我的问题是,关于语法的递归性质。考虑到差异表达式有 2 个评估表达式,java 示例将如何工作。
我尝试将表达式传递给类构造函数,如下所示:
public class DiffExp implements LetLangExp {
LetLangExp left, right;
public DiffExp(LetLangExp l, LetLangExp r) {
left = l;
right = r;
eval();
}
}
这仅适用于 -(number,number) 的差异表达式,但递归它不起作用,因为我似乎无法理解解析它的递归性质。我被这个例子困住了,我在网上看过,但我似乎无法将这种语法与我所见过的任何东西模棱两可。
基本上我如何实现一个递归处理的差异表达式,它可以将差异表达式作为操作数并相应地计算?
编辑:根据 Markspace 的要求,我正在尝试为解析树构建节点结构。这是我现在上的课。
class ExprNode{
String c;
static String operator;
static ExprNode operand1;
static ExprNode operand2;
public ExprNode(String num){
c = num;
operand1 = operand2 = null;
}
public static void Expr(String op, ExprNode e1, ExprNode e2){
operator = op;
operand1 = e1;
operand2 = e2;
}
}
【问题讨论】:
-
在解析所有子节点之前,我看不到如何
eval()表达式,所以我很难看到在ctor 中调用eval()是个好主意。 -
这就是我正在努力解决的问题,当我将令牌解析为递归表示时,我不知道如何跟踪它们。如果可能有帮助,我已经使用令牌流输出编辑了我的帖子。但据我所知,在评估它之前,我需要先将其构建为树结构?
-
我完全不确定你在“挣扎”什么。制作一棵树并将节点/表达式放入其中。你能做到那么多吗?请显示执行此操作的代码。
-
-(-(8,3)4)根据您的语法不是有效的表达式。是不是少了一个逗号? -
规则 3 中有一个逗号,它不是表达式的有效表示。
标签: java parsing recursion recursive-descent