首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@init之前调用的ANTLR4语义谓词

@init之前调用的ANTLR4语义谓词
EN

Stack Overflow用户
提问于 2014-05-09 18:01:33
回答 1查看 599关注 0票数 1

我在子规则中有一个带有语义谓词的语法,它要求在调用规则中进行初始化,以便正确执行。

代码语言:javascript
复制
decl_specifier_seq
 @init {
   //some initialization required by a semantic predicate
 }
: decl_specifier+ ;

decl_specifier
:
      storage_class_specifier //auto, register, static, extern, mutable
    | {/*semantic predicate requiring the initialization*/}? type_specifier 
    | function_specifier //inline, virtual, explicit
;

但是一些测试表明语义谓词抛出NullPointerException,因为它是在调用规则的@init{}块中的初始化调用之前调用的。

在检查生成的Parser代码之后,我发现还有另一个函数包含我的语义谓词:

代码语言:javascript
复制
private boolean decl_specifier_sempred(Decl_specifierContext _localctx, int predIndex) 

似乎在调用我的@init{}块来进行初始化之前调用了该函数。是人为的还是什么的?异常包含上述函数的名称:

代码语言:javascript
复制
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.antlr.v4.runtime.misc.TestRig.process(TestRig.java:249)
        at org.antlr.v4.runtime.misc.TestRig.process(TestRig.java:211)
        at org.antlr.v4.runtime.misc.TestRig.main(TestRig.java:143)
Caused by: java.lang.NullPointerException
        at cppParser.CPPProcessorParser.decl_specifier_sempred(CPPProcessorParse
r.java:10989)
        at cppParser.CPPProcessorParser.sempred(CPPProcessorParser.java:10853)
        at org.antlr.v4.runtime.atn.SemanticContext$Predicate.eval(SemanticConte
xt.java:119)
        at org.antlr.v4.runtime.atn.ParserATNSimulator.evalSemanticContext(Parse
rATNSimulator.java:1295)
        at org.antlr.v4.runtime.atn.ParserATNSimulator.execATN(ParserATNSimulato
r.java:539)
        at org.antlr.v4.runtime.atn.ParserATNSimulator.adaptivePredict(ParserATN
Simulator.java:415)
        at cppParser.CPPProcessorParser.cppCompilationUnit(CPPProcessorParser.ja
va:330)
        ... 7 more

在调用@init{}块之前会遇到此异常。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-09 21:23:56

ANTLR 4根据谓词是否“上下文敏感”来确定谓词的行为。上下文敏感谓词使用$语法引用当前规则中定义的参数、标签、本地或规则/令牌。在您的示例中,您在标准ANTLR语法之外定义和初始化状态信息,因此无法知道谓词是上下文敏感的。解决这一问题有两种方法:

  1. 定义一个或多个状态变量,这些变量用于规则的locals块中的谓词中,而不是@members块中。
  2. 在谓词中的注释中添加对$ctx的引用。例如,您可以在谓词的末尾添加/*$ctx*/

如果遇到上下文敏感谓词,但没有可用的上下文信息(就像您的代码一样),则假设谓词为true。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23571210

复制
相关文章

相似问题

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