java - 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) {
}
}
解决方案
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
推荐阅读
- android - 版本冲突错误而不添加错误显示的任何依赖项?
- javascript - 使用蒙特卡罗模拟限制计算 π
- wordpress - 如何过滤与当前帖子具有相同分类术语的自定义帖子?
- google-app-engine - Google App Engine Standard Java 8 - 如何为实例添加健康检查?
- mysql - SQL查询多对多关系
- vb.net - 一次替换多个字符串
- python - Python - 如何使用 Open-cv 或 PIL 将 24 位 PNG 图像转换为 32 位
- php - 如何覆盖位于供应商目录中的方法?
- python - 使用csv文件中的数据在python中绘制图形时如何解决错误?
- javascript - 将二维数组合并为对象数组