我正在考虑在一个项目中使用CUP解析器生成器。为了正确解析我将要编译的语言的某些构造,我需要词法分析器(由JFlex生成)在调用next_token()方法时使用解析器的符号表(不是解析表--我指的是存储有关标识符的信息的表)中的信息来生成正确的令牌类型。由于符号表中的信息静态地依赖于程序文本,因此只有在使用解析器“同步地”调用next_token()方法时,这才能起作用。换句话说,如果解析器在需要另一个令牌时调用词法分析器,这将起作用,但如果(例如)有一个并行线程正在调用队列中的词法分析器和缓冲令牌,则不会这样做。
问题是: CUP是如何调用词法分析器的?它会在需要下一个令牌时调用它吗?当然,我可以只编写一个CUP语法规范,并检查生成的解析器的源文件,看看发生了什么,但这可能是多余的工作。我在相关网站上找不到任何关于这方面的信息。
非常感谢您能提供的任何帮助!
发布于 2015-02-21 00:15:59
不久前,我完成了解析器和扫描器的实现。这是我发现的:
CUP确实会在需要时调用扫描器。它总是在到目前为止已经识别的令牌( lookahead令牌)之前缓冲另一个令牌。没有提前对令牌进行奇特的缓冲。
也就是说,在解析过程中设置词法分析器状态可能很棘手,因为这可能会导致许多语法冲突。我猜这与CUP表示嵌入到产品中的语义操作的方式有关。这迫使我放弃了最初的设计,但不是因为我害怕的原因。
希望这对某些人有帮助!
发布于 2015-01-22 03:38:53
也许这个回复对你来说太晚了,但对其他用户可能有用。首先要知道的是,如果没有扫描器,解析器就不能做任何事情。事实上,解析器的构造函数的第一个参数是scanner。在编译.cup文件之后,您将得到一个与.cup文件同名的.java文件作为输出。假设它的名字是Parser。因此,在项目的主类中,您必须添加以下行:
TmpParser p = new TmpParser (new Scanner (new Reader (s)));
p.parse();您应该将此代码发布到try-catch块中。使用方法parse,解析器启动其操作,并调用扫描器的next_token方法,以便识别令牌并验证您编写的语法规则是否正确。
发布于 2016-10-10 01:49:15
我不知道我回答这个问题有多晚,但我正在构建一个解析器作为我课程工作的一部分。我将Lex和CUP分别用于lexer和Parser。我还包括了调用解析器的主类,解析器在get令牌调用时进行扫描,所以我的驱动程序类将是:
// 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();https://stackoverflow.com/questions/27029158
复制相似问题