【问题标题】: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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多