Java CUP和JFlex交互

时间:2014-11-19 23:38:23

标签: parsing lexical-analysis parser-generator jflex cup

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

问题是:CUP如何调用词法分析器?它是否在需要下一个令牌时调用它?我当然可以编写一个CUP语法规范并检查生成的解析器的源文件以查看正在进行的操作,但这可能比必要的工作更多。我无法在相关网站上找到相关信息。

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

3 个答案:

答案 0 :(得分:2)

我刚刚完成了解析器和扫描程序的实现。这是我发现的:

CUP确实会在需要时调用扫描仪。它始终在目前已识别的内容(前瞻标记)之前缓冲一个令牌。提前没有花哨的缓冲令牌。

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

希望这有助于某人!

答案 1 :(得分:1)

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

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

您应该将此代码发布到try-catch块中。使用方法解析,Parser会启动其操作,并且还会调用Scanner的next_token方法,以便识别令牌并验证您编写的语法规则是否正确。

答案 2 :(得分:0)

我不知道我有多晚回答这个问题, 但是我将构建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实习生致电:

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();