【问题标题】:Parsing an expression with tokens使用标记解析表达式
【发布时间】:2015-05-12 02:57:08
【问题描述】:
我想为下面的语法写一个递归下降解析器
术语 ---> 最终 | FUNCTION_A(术语,术语)| FUNCTION_B(术语,术语)
目前我正在努力处理 FUNCTION 部分,因为我不知道如何处理命令包含嵌套 FUNCTIONS 的情况,例如
FUNCTION_A (FUNCTION_B (FINAL, FINAL), FINAL)
我已经阅读了很多教程,但没有一个能真正帮助我完成这个过程。据我所知,可以使用 StringTokenizer 来解决这个问题。
对于上面的例子,我如何使用 Tokens 来识别 FUNCTION_A 的第一个词和第二个词?
【问题讨论】:
标签:
java
parsing
recursion
compiler-construction
tokenize
【解决方案1】:
如果知道以下内容,我们深感抱歉。递归下降解析器就是这样:
boolean parseTerm() {
return parseFinal() || parseFunctionA() || parseFunctionB();
}
boolean parseFunctionA() {
if (!scannedToken("FUNCTION_A")) {
return false;
}
mustScan("(");
must(parseTerm());
mustScan(",");
must(parseTerm());
mustScane(")");
return true;
}
StringTokenizer 将整个文本作为字符串处理,并用分隔符分隔标记。它也不区分标识符、数字等。
Scanner 似乎更合适。它对整个令牌进行了hasNext(pattern) 测试。同样,标识符/名称的字边界不是立即可用的。
boolean scannedToken(String s) {
Pattern pattern = Pattern.compile("\\b" + Pattern.quote(s) + "\\b");
if (scanner.hasNext(pattern)) {
String actual = scanner.next(pattern);
return true;
}
return false;
}