ANTLR v4: как реализовать деактивацию альтернатив правил в слушателе, таких как встроенный предикат semanti c в файле грамматики? - PullRequest
1 голос
/ 28 мая 2020

У меня есть java target v4 ANTLR грамматика. Я хочу реализовать ту же функциональность встроенного предиката semanti c с помощью слушателя, чтобы освободить мою грамматику от встроенных действий, специфичных для языка c. Предлагается отключить альтернативное сопоставление подправил. Я знаю, как написать расширенный BaseListener и отказаться от этого, но на самом деле не знаю, как это сделать, поскольку я новичок. 1004 *

beVerb: {singularSub}? 'is'|
        {pluralSub}? 'are';

Мой слушатель

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

        }
}

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете сделать что-то вроде этого:

sentences
 : sentence+ EOF
 ;

sentence
 : subject beVerb
 ;

, а затем переопределить метод enterSentence(...) и проверить его subject и beVerb:

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

...