【问题标题】:Custom AST in JavaCC?JavaCC 中的自定义 AST?
【发布时间】:2016-05-24 15:03:26
【问题描述】:

我最近开始设计我的第一个编程语言,并且已经精通 java,我已经开始为我的 java 语言构建 AST API。我计划编译成 java 字节码,这在我已经实现的 AST 的当前部分中是有效的和工作的。在偶然发现解析器生成器,特别是 JavaCC 之前,我尝试了几种不同的解析方法(都失败了)。我对 JavaCC 和 EBNF 进行了一些基础研究,并且想知道 JavaCC 在解析我的语言时是否可以支持完全自定义的 AST API(包括构造函数参数等)。在对 JavaCC 进行深入研究和观看/阅读教程之前,我想在这里问这个问题。从我所见,JavaCC 可以支持 AST,但我不确定限制是什么。此外,我知道 JavaCC 有自己的 AST API,但我想坚持使用我已经开发的那个,因为它可以正常工作并且与我的语言非常匹配。

【问题讨论】:

    标签: abstract-syntax-tree javacc


    【解决方案1】:

    当然。例如你可以这样写非终结符

    CommandNode whileCommand() : {
        ExpressionNode e ;
        CommandNode doPart ;
    } {
        <WHILE> e = expression() <DO>
        doPart = sequence() <ENDWHILE>
        { return new WhileCommand( e, doPart ) ; }
    }
    

    构建器模式有助于将解析器与 AST 的某些细节隔离开来。

    【讨论】:

    • 太棒了!谢谢。前瞻的东西呢?比如说我已经到了一个注解节点,但是注解节点是下一个字段/方法节点的参数,这可能吗?
    • 我不确定我是否理解您提出的新问题。无论如何,我会尝试回答:语义操作不会在前瞻期间执行,因此您可以随意使用前瞻,而无需与树构建进行任何交互。如果这不能回答它,你能把它作为一个新问题发布吗?
    • 我想一个更好的问题是“是否有全局变量”,因为我想要的可以用它来完成。那么,JavaCC 是否支持全局变量。
    • 当然。 JavaCC 生成的解析器类只是一种日常的 Java 类。 JavaCC 只是为您生成一些方法(解析方法),但除此之外,您可以以任何您想要的方式编写类。因此,您可以在解析器类中声明字段,这些字段将是解析方法的全局变量。如果您使用构建器模式,您还可以将状态(即字段)放入构建器对象中。那么解析器需要的唯一字段就是对构建器对象的引用。
    • 太棒了。我没有意识到 JavaCC 是这样工作的。我一定会进一步研究,感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多