首页 > 解决方案 > ANTLR v4:如何在侦听器中实现规则替代的停用,例如语法文件中的嵌入式语义谓词?

问题描述

我有一个 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) {

        }
}

标签: javaparsingcompiler-constructionantlr4

解决方案


You could do something like this:

sentences
 : sentence+ EOF
 ;

sentence
 : subject beVerb
 ;

and then override the enterSentence(...) method and inspect the subject and beVerb from it:

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?
        }
    }
}

Note that for parsing real human languages, ANTLR is not a good fit. In such cases, look into using something like Stanford's Natural Language Processing tools: https://nlp.stanford.edu/software


推荐阅读