1

使用(简化的)语法来识别表单的类

classDeclaration
    : Class className=Identifier
      ( Extends parentClassIdentifier=PackageIdentifier )?
      ( classSpecifier )*
      Semicolon
    ;
classSpecifier
    : ( Abstract | Final )
    | /* ... */
    ;

可以很容易地创建一个类并使其既抽象又最终

class MyContradiction abstract final;

在我目前的语法中,我有一些组合起来没有意义的关键字。我如何检查那些没有意义的组合。我应该修改我的语法以通过包含可怕的循环和检查来防止这种情况发生,还是应该使用侦听器或访问者检查代码中设置了哪些标志而哪些没有意义?

4

1 回答 1

4

我会说在代码中检查这些错误组合会更好,因为您有机会向用户提供比“语法错误”之类的错误消息更好的错误消息。

澄清一下,检查这些语义约束、捕获错误的关键字组合等的代码应该在代码中,但在解析器语义动作的代码中。这是最适合它的地方。因此,您将其与语法放在同一个文件中,但不会使语法本身更复杂。

我见过解析器,其中语义操作包含评估被解析语言的表达式的代码,基本上有些人将解析语言的解释器嵌入语法文件中。这是错误的。解析器应该产生 AST,就是这样。但是,我相信,最好还是检查语法文件中语义动作中的关键字组合错误。学习你的语法的人不会看到这些与语法相关的东西,你也可能在解析完成后忘记做这些检查。而且,毕竟,从你的解析器返回一个对你的语法来说是非法的文本的 AST 有点狡猾,不是吗?

于 2013-02-23T20:05:53.947 回答