Java ANTLR:“是的;缺少对规则范围的属性访问;问题
我正在尝试构建一个ANTLR语法,用于解析标记语句,例如:Java ANTLR:“是的;缺少对规则范围的属性访问;问题,java,antlr,Java,Antlr,我正在尝试构建一个ANTLR语法,用于解析标记语句,例如: DT The NP cat VB ate DT a NP rat 并掌握语法: fragment TOKEN : (('A'..'Z') | ('a'..'z'))+; fragment WS : (' ' | '\t')+; WSX : WS; DTTOK : ('DT' WS TOKEN); NPTOK : ('NP' WS TOKEN); nounPhrase: (DTTOK WSX NPTOK)
DT The NP cat VB ate DT a NP rat
并掌握语法:
fragment TOKEN : (('A'..'Z') | ('a'..'z'))+;
fragment WS : (' ' | '\t')+;
WSX : WS;
DTTOK : ('DT' WS TOKEN);
NPTOK : ('NP' WS TOKEN);
nounPhrase: (DTTOK WSX NPTOK);
chunker : nounPhrase {System.out.println("chunk found "+"("+$nounPhrase+")");};
语法生成器在最后一行生成“缺少对规则作用域的属性访问:nounPhrase
”
[我还是ANTLR新手,虽然有些语法可以使用,但仍然是反复试验。在运行如此之小的语法时,我也经常会遇到“OutOfMemory”错误-欢迎任何帮助。]
我正在使用ANTLRWorks 1.3生成代码,并在Java 1.6下运行。在找到更好的方法后回答问题
WS : (' '|'\t')+;
TOKEN : (('A'..'Z') | ('a'..'z'))+;
dttok : 'DT' WS TOKEN;
nntok : 'NN' WS TOKEN;
nounPhrase : (dttok WS nntok);
chunker : nounPhrase ;
问题是我在词法分析器和语法分析器之间搞混了(这显然很常见)。大写项是词法项,在解析器中是小写项。这现在似乎奏效了。(注意,我已将NP改为NN)。在原始语法中,为什么不包括它所要求的属性,很可能是:
chunker : nounPhrase {System.out.println("chunk found "+"("+$nounPhrase.text+")");};
您的每个规则(chunker
是我可以很快发现的规则)都有与之关联的属性(额外信息)。您可以在上找到不同类型规则的不同属性的快速列表,如果在网页上为这些属性中的每一个进行描述(例如,解析器规则的start和stop属性引用您的lexer中的标记,这将允许您返回到行号和位置),那就太好了
我认为你的chunker规则应该稍微改变一下,而不是$nounPhrase
,你应该使用$nounPhrase.text
<代码>文本是名词短语
规则的属性
您可能还需要进行一些其他格式化,通常解析器规则(以小写字母开头)出现在lexer规则(以大写字母开头)之前
注:当我在框中键入时,chunker规则从新行开始,但在我的原始回答中,它没有从新行开始。“缺少属性访问”表示您引用了范围($nounPhrase
)而不是范围的属性(例如$nounPhrase.text
)
通常,解决属性问题的一个好方法是查看所讨论规则的生成解析器方法
例如,当我有点生疏时,我最初尝试创建一个新规则:
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add($a.value); names.add($b.value); };
在您的情况下,您需要的版本可能会有所不同,但是您通常可以通过查看生成的代码来非常轻松地找到它。如果您不小心做了一些愚蠢的事情,例如
$thing.$attribute
,您的意思是$thing.attribute
,您还将看到规则范围上缺少属性访问的错误消息。(我知道这个问题很久以前就得到了回答,但这一点琐事可能会帮助看到错误消息的其他人!)请您进一步澄清好吗?我不确定属性是什么
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add($a); names.add($b); };
public final List<Name> multiple_names() throws RecognitionException {
List<Name> names = null; // based on "returns" clause of rule definition
Name a = null; // based on scopes declared in rule definition
Name b = null; // based on scopes declared in rule definition
names = new ArrayList<Name>(4); // snippet inserted from `@init` block
try {
pushFollow(FOLLOW_fullname_in_multiple_names42);
a=fullname();
state._fsp--;
match(input,189,FOLLOW_189_in_multiple_names44);
pushFollow(FOLLOW_fullname_in_multiple_names48);
b=fullname();
state._fsp--;
names.add($a); names.add($b);// code inserted from {...} block
}
catch (RecognitionException re) {
reportError(re);
recover(input,re);
}
finally {
// do for sure before leaving
}
return names; // based on "returns" clause of rule definition
}
multiple_names returns [List<Name> names]
@init {
names = new ArrayList<Name>(4);
}
: a=fullname ' AND ' b=fullname { names.add(a); names.add(b); };