私は、次のEBNF文法とXMLの架空のサブセットのためのパーサを作ることを約だ:このXMLサブセットのLL(1)文法はありますか?
DOCUMENT ::= ELEMENT
ELEMENT ::= START_TAG (ELEMENT | DATA)* END_TAG | EMPTY_TAG
START_TAG ::= < NAME ATTRIBUTE* >
END_TAG ::= </ NAME >
EMPTY_TAG ::= < NAME ATTRIBUTE* />
ATTRIBUTE ::= NAME = STRING
上記は変更せず、「そのまま」の文法です。ここはLLに変換で私の試みである(1):
DOCUMENT ::= ELEMENT EOF
ELEMENT ::= PREFIX > ELEMENT_OR_DATA END_TAG
| PREFIX />
PREFIX ::= < NAME OPT_ATTR
ELEMENT_OR_DATA ::= OPT_ELEMENT ELEMENT_OR_DATA
| OPT_DATA ELEMENT_OR_DATA
| epsilon
OPT_ELEMENT ::= ELM_LIST | epsilon
ELM_LIST ::= ELEMENT | ELEMENT ELM_LIST
OPT_DATA ::= DATA_LIST | epsilon
DATA_LIST ::= DATA | DATA DATA_LIST
END_TAG ::= </ NAME >
OPT_ATTR ::= ATTR_LIST | epsilon
ATTR_LIST ::= ATTRIBUTE | ATTRIBUTE ATTR_LIST
ATTRIBUTE ::= NAME = STRING
EOF ::= &$
これは、元のLL(1)バージョンですか?そうでない場合、どこが間違っていたのですか?もしそうなら、意味を変えずに「単純化」する方法はありますか?私は、可能な限りシンプルなバージョンを持っていると確信していません。
これは明らかです。
ありがとうございました!トークンはNAME、STRING、DATA、<, >、, />、および=ですので、あなたの前提は正しいです。 1つの最後の質問:これはLR(1)文法ですか?つまり、ここでLL(1)とLR(1)の両方の構文解析に使用したのと同じ文法を使用できますか? –
LL文法もLRです。 – Slava
また、Kleeneの星を明らかに拡張するだけで、元の文法はLR(1)になります。LR(k)文法は左回帰に問題がない。 – rici