使用标记解析表达式

时间:2015-03-10 15:27:05

标签: java parsing recursion compiler-construction tokenize

我想为以下语法编写一个递归下降解析器

  

术语--->最终| FUNCTION_A(术语,术语)| FUNCTION_B(术语,术语)

目前我正在使用FUNCTION部分,因为我不知道,如何处理案例,其中命令包含嵌套的FUNCTIONS,例如

  

FUNCTION_A(FUNCTION_B(最终,最终),最终)

我已经阅读了很多教程,但没有一个真正帮助我完成了这个。据我所知,可以使用StringTokenizer来解决这个问题。

如何使用代币识别上述示例的FUNCTION_A的第一项和第二项?

1 个答案:

答案 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;
}