首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java CUP与JFlex交互

Java CUP与JFlex交互
EN

Stack Overflow用户
提问于 2014-11-20 07:38:23
回答 3查看 2.1K关注 0票数 0

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2015-02-21 00:15:59

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

CUP确实会在需要时调用扫描器。它总是在到目前为止已经识别的令牌( lookahead令牌)之前缓冲另一个令牌。没有提前对令牌进行奇特的缓冲。

也就是说,在解析过程中设置词法分析器状态可能很棘手,因为这可能会导致许多语法冲突。我猜这与CUP表示嵌入到产品中的语义操作的方式有关。这迫使我放弃了最初的设计,但不是因为我害怕的原因。

希望这对某些人有帮助!

票数 2
EN

Stack Overflow用户

发布于 2015-01-22 03:38:53

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

代码语言:javascript
复制
TmpParser p = new TmpParser (new Scanner (new Reader (s)));   
        p.parse();

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

票数 1
EN

Stack Overflow用户

发布于 2016-10-10 01:49:15

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

代码语言:javascript
复制
// construct the lexer, 
Yylex lexer = new Yylex(new FileReader(filename));
// create the parser
Parser parser = new Parser(lexer);
// and parse

解析器实习生调用:

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27029158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档