【发布时间】:2019-12-09 08:20:27
【问题描述】:
我想在 java 中为以下语法创建一个递归后代解析器(我已设法创建标记)。这是语法的相关部分:
expression ::= numeric_expression | identifier | "null"
identifier ::= "a..z,$,_"
numeric_expression ::= ( ( "-" | "++" | "--" ) expression )
| ( expression ( "++" | "--" ) )
| ( expression ( "+" | "+=" | "-" | "-=" | "*" | "*=" | "/" | "/=" | "%" | "%=" ) expression )
arglist ::= expression { "," expression }
我已经编写了解析numeric_expression的代码(假设如果令牌无效,则返回null):
NumericAST<? extends OpAST> parseNumericExpr() {
OpAST op;
if (token.getCodes() == Lexer.CODES.UNARY_OP) { //Check for unary operator like "++" or "--" etc
op = new UnaryOpAST(token.getValue());
token = getNextToken();
AST expr = parseExpr(); // Method that returns expression node.
if (expr == null) {
op = null;
return null;
} else {
if (checkSemi()) {
System.out.println("UNARY AST CREATED");
return new NumericAST<OpAST>(expr, op, false);
}
else {
return null;
}
}
} else { // Binary operation like "a+b", where a,b ->expression
AST expr = parseExpr();
if (expr == null) {
return null;
} else {
token = getNextToken();
if (token.getCodes() == Lexer.CODES.UNARY_OP) {
op = new UnaryOpAST(token.getValue());
return new NumericAST<OpAST>(expr, op, true);
} else if (token.getCodes() == Lexer.CODES.BIN_OP) {
op = new BinaryOpAST(token.getValue());
token = getNextToken();
AST expr2 = parseExpr();
if (expr2 == null) {
op = null;
expr = null;
return null;
} else {
if (checkSemi()) {
System.out.println("BINARY AST CREATED");
return new NumericAST<OpAST>(expr, op, expr2);
}
else {
return null;
}
}
} else {
expr = null;
return null;
}
}
}
}
现在,如果我得到像 ++ 这样的一元运算符,我可以直接调用此方法,但我不知道识别其他语法,从相同的产生开始,如 arglist 和 numeric_expression 具有“表达式”作为开始产生。
我的问题是:
如果我得到一个表达式令牌,如何识别是调用parseNumericExpr()还是parseArgList()(上面没有提到的方法)?
【问题讨论】:
-
您好,澄清一下,这是您的完整语法定义吗?您似乎在代码中使用了
UnaryOperatorAST,但一元运算符表达式似乎不是您语法中的构建块。 -
这道题太笼统了,其实是多题合二为一。请将您的问题集中在 一个 特定问题上,并记住这不是代码审查网站。
-
@JoakimDanielson 我已经澄清了,请检查
-
@PaulBenn,没有提到完整的语法,只是其中的一部分