java - ANTLR v4 : How to implement deactivation of rule alternatives in listener like embedded semantic predicate in grammar file?

标签 java parsing compiler-construction antlr4

我有一个 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 : How to implement deactivation of rule alternatives in listener like embedded semantic predicate in grammar file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62062110/

相关文章:

c - 使用 strtok 在 C 中解析字符串

linux - Glibc 编译需要多长时间?

JavaFX 对话框一次又一次返回相同的结果

java - 如何从 Android 数组中的 Parse 数据库获取数据?

parsing - 修复 Bison 语法中的移位/减少冲突

history - 文本段的名称从何而来?

c++ - 为什么要初始化这个数据成员?

java - JUnit 在 Linux 上安装失败

java - 为什么这个java正则表达式不起作用?

php - 将格式化文本文件解析为 PHP 数组