0

コンピュータサイエンスのコースで構文解析/字句解析について学んでいます。そのためにANTLRを使用しています。

XML言語を変更しているので、もう曖昧ではありませんが、文法に変更を加えると、ANTLRは文句を言います。

私はこの特定の質問が以前に尋ねられたことを知っていますが、それは本当に役に立ちませんでした!

ANTLR:alts 1,2から到達可能な再帰的なルール呼び出しのため、ルールトークンにはLL(*)以外の決定があります

commando-promptからANTLRを実行しているときのエラーのスナップショットを撮りました。 エラーのスナップショット

XML文法は次のとおりです。

grammar XML;

options {
language = Java;
}
@lexer::members {
boolean inTag = true;
}
xml_file returns [TaggedElement value]
: tagged_element EOF
;

tagged_element
: start_tag element_body end_tag 
;

element_body
: element
| element element_body
;

element
: data_element
| tagged_element
;

data_element
: PCDATA
;

start_tag
: OPEN_START_TAG NAME CLOSE_TAG
;

end_tag
: OPEN_END_TAG NAME CLOSE_TAG
;

OPEN_START_TAG : '<'  { inTag = true; };
OPEN_END_TAG   : '</' { inTag = true; };
CLOSE_TAG      : '>'  { inTag = false; };

NAME   : {inTag}?=> ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')* ;
WS     : {inTag}?=> (' '|'\t'|'\r'|'\n')+ { $channel = HIDDEN; } ; 
PCDATA : {!inTag}?=> (~'<')+ { setText($text.trim()); if ($text.length() == 0) $channel = HIDDEN; } ;

問題はで発生します

element_body

ここで、文法を「修正」しました。だから私の質問は->この文法で何を絞り込んでいるのか、そしてどうすればそれを機能させることができますか?どんな助けでも大歓迎です!

4

1 に答える 1

2

次のようにルールを因数分解してみてください。

element_body
    : element element_body?
;
于 2013-03-17T22:33:20.600 に答える