我想为以下语法编写一个递归下降解析器
术语--->最终| FUNCTION_A(术语,术语)| FUNCTION_B(术语,术语)
目前我正在使用FUNCTION部分,因为我不知道,如何处理案例,其中命令包含嵌套的FUNCTIONS,例如
FUNCTION_A(FUNCTION_B(最终,最终),最终)
我已经阅读了很多教程,但没有一个真正帮助我完成了这个。据我所知,可以使用StringTokenizer来解决这个问题。
如何使用代币识别上述示例的FUNCTION_A的第一项和第二项?
答案 0 :(得分:0)
很抱歉,如果知道以下内容。递归下降解析器只是:
boolean parseTerm() {
return parseFinal() || parseFunctionA() || parseFunctionB();
}
boolean parseFunctionA() {
if (!scannedToken("FUNCTION_A")) {
return false;
}
mustScan("(");
must(parseTerm());
mustScan(",");
must(parseTerm());
mustScane(")");
return true;
}
StringTokenizer将整个文本作为String处理,并使用分隔符分隔标记。它也没有像标识符,数字等那样区别。
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;
}