ANTLR v4:如何在语法文件中实现规则替代方案的停用,如语法文件中的嵌入式语义谓词?
ANTLR v4 : How to implement deactivation of rule alternatives in listener like embedded semantic predicate in grammar file?
我有一个 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(...)
方法并从中检查 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
我有一个 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(...)
方法并从中检查 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