Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ANTLR:“是的;缺少对规则范围的属性访问;问题_Java_Antlr - Fatal编程技术网

Java 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)

我正在尝试构建一个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);
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); };