我有一个Java目标v4 ANTLR语法。我想使用侦听器实现嵌入式语义谓词的相同功能,以使语法从特定于语言的嵌入式动作中解放出来。建议是停用备用子规则匹配。我知道如何编写扩展BaseListener并对其进行覆盖,但是由于我是初学者,所以实际上不知道如何执行此操作。

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
 ;


然后覆盖enterSentence(...)方法并从中检查subjectbeVerb

class MyGListener extends MyParserGrammarBaseListener {

    @Override
    public void enterSentence(MyParserGrammarParser.SentenceContext ctx) {

        boolean isPluralSubject = ctx.subject().getText().equals("They");
        boolean isPluralVerb = ctx.beVerb().getText().equals("are");

        if (isPluralSubject != isPluralVerb) {
            // throw an exception?
        }
    }
}


请注意,对于解析真实的人类语言,ANTLR不适合。在这种情况下,请考虑使用类似斯坦福大学自然语言处理工具的方法:https://nlp.stanford.edu/software

关于java - ANTLR v4:如何在监听器中停用规则替代项,例如语法文件中的嵌入式语义谓词?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62062110/

10-12 22:46