Java ANTLR v4:如何在类似侦听器的语法文件中嵌入语义谓词中实现规则替代项的停用?

Java ANTLR v4:如何在类似侦听器的语法文件中嵌入语义谓词中实现规则替代项的停用?,java,parsing,compiler-construction,antlr4,Java,Parsing,Compiler Construction,Antlr4,我有一个java目标v4 ANTLR语法。我想使用监听器实现嵌入语义谓词的相同功能,从而将语法从特定于语言的嵌入操作中解放出来。建议停用备用子规则匹配。我知道如何编写ExtendBaseListener和overide,但由于我是初学者,我真的不知道如何编写 grammar MyParserGrammar; @parser::members { public static boolean singularSub, pluralSub; } sentence: (subject b

我有一个java目标v4 ANTLR语法。我想使用监听器实现嵌入语义谓词的相同功能,从而将语法从特定于语言的嵌入操作中解放出来。建议停用备用子规则匹配。我知道如何编写ExtendBaseListener和overide,但由于我是初学者,我真的不知道如何编写

grammar MyParserGrammar;
@parser::members {
    public static boolean singularSub, pluralSub;
    }
sentence: (subject beVerb)+
            {
            singularSub=false;
            pluralSub=false;
            }
            ;
subject: singularSub {singularSub=true;}|
         pluralSub {pluralSub=true;};
singularSub : 'He';
pluralSub : 'They';
beVerb: {singularSub}? 'is'|
        {pluralSub}? 'are';
 WS: [ \t\r\n]->skip;
我想筛选的确切部分对我来说非常困难:

beVerb: {singularSub}? 'is'|
        {pluralSub}? 'are';
我的听众

public MyGListener extends MyParserGrammarBaseListener{
        @Override 
        public void exitBeVerb(MyParserGrammarParser.BeVerbContext ctx) {

        }
}

你可以这样做:

sentences
 : sentence+ EOF
 ;

sentence
 : subject beVerb
 ;
然后重写
enter句子(…)
方法,并从中检查
主题
beVerb

类MyGListener扩展MyParserGrammarBaseListener{ @凌驾 公共无效输入语句(MyParserGrammarParser.SentenceContext ctx){ 布尔值isPluralSubject=ctx.subject().getText().equals(“他们”); 布尔值isPluralVerb=ctx.beVerb().getText().equals(“are”); if(isPluralSubject!=isPluralVerb){ //抛出异常? } } }
注意,对于解析真正的人类语言,ANTLR并不适合。在这种情况下,可以考虑使用斯坦福大学的自然语言处理工具:

您可以这样做:

sentences
 : sentence+ EOF
 ;

sentence
 : subject beVerb
 ;
然后重写
enter句子(…)
方法,并从中检查
主题
beVerb

类MyGListener扩展MyParserGrammarBaseListener{ @凌驾 公共无效输入语句(MyParserGrammarParser.SentenceContext ctx){ 布尔值isPluralSubject=ctx.subject().getText().equals(“他们”); 布尔值isPluralVerb=ctx.beVerb().getText().equals(“are”); if(isPluralSubject!=isPluralVerb){ //抛出异常? } } } 注意,对于解析真正的人类语言,ANTLR并不适合。在这种情况下,可以考虑使用斯坦福大学的自然语言处理工具: