繁体   English   中英

Java CUP和JFlex交互

[英]Java CUP and JFlex Interaction

我正在考虑为项目使用CUP解析器生成器。 为了正确地解析我将要编译的语言的某些结构,我将需要词法分析器(由JFlex生成)来使用符号表(而不是解析表)中的信息-我的意思是将要存储在其中的表解析器的信息(有关标识符的信息),以在调用其next_token()方法时生成正确的令牌类型。 由于符号表中的信息静态依赖于程序文本,因此只有在使用解析器“在锁步中”调用next_token()方法时,这才起作用。 换句话说,如果解析器每当需要另一个令牌时就调用词法分析器,则这将起作用,但是(例如)如果有一个并行线程正在调用词法分析器并在队列中缓冲令牌,则不会。

因此,问题是:CUP如何调用词法分析器? 每当需要下一个令牌时会调用它吗? 我当然可以只编写一个CUP语法规范并检查生成的解析器的源文件以查看发生了什么,但这可能比必要的工作多。 我在相关网站上找不到任何信息。

非常感谢您提供的任何帮助!

我不久前完成了解析器和扫描器的实现。 这是我发现的:

实际上,CUP确实会在需要时调用扫描程序。 它总是在到目前为止已识别的令牌(超前令牌)之前再缓冲一个令牌。 提前没有令牌的花式缓冲。

话虽这么说,在解析过程中设置词法分析器状态可能很棘手,因为这会引起许多语法冲突。 我想这与CUP表示产品中嵌入的语义动作的方式有关。 尽管如此,这迫使我放弃了最初的设计,但这并不是出于我害怕的原因。

希望这对某人有帮助!

也许此回复对您来说为时已晚,但对其他用户可能有用。 首先要知道的是,没有扫描仪,解析器将无法执行任何操作。 实际上,解析器的构造函数的第一个参数是扫描器。 编译完.cup文件后,您将获得一个与.cup名称相同的.java文件作为输出。 让我们假设它的名字是Parser。 因此,在项目的主类中,您必须添加以下行:

TmpParser p = new TmpParser (new Scanner (new Reader (s)));   
        p.parse();

您应该将此代码发布到try-catch块中。 通过解析方法,解析器将开始其操作,并调用扫描程序的next_token方法,以便识别令牌并验证您编写的语法规则是否正确。

我不知道我要回答这个问题有多晚,但是我正在构建1个解析器作为我的课程工作的一部分。我分别将Lex和CUP用于lexer和Parser。 我还包括我的主类,该主类调用解析器,该解析器将按要求在获取令牌调用时进行扫描,因此我的驱动程序类将是:

// construct the lexer, 
Yylex lexer = new Yylex(new FileReader(filename));
// create the parser
Parser parser = new Parser(lexer);
// and parse

解析器实习生调用:

Parser.parse() {
    ...
    this.cur_token = this.scan();
    ...
}

public Symbol scan() throws Exception {
    Symbol sym = this.getScanner().next_token();
    return sym != null ? sym : this.getSymbolFactory().newSymbol("END_OF_FILE", this.EOF_sym());
}

parser.parse();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM