나는 다음과 같은 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
것은 위의 문법이다.
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) 버전입니다 : 은 여기에 (1) LL로 변환 나의 시도인가? 그렇지 않다면 어디서 잘못 되었습니까? 그렇다면 의미를 바꾸지 않고 '단순화'할 방법이 있습니까? 나는 내가 가능한 가장 간단한 버전을 가지고 있다고 확신하지 않는다.
희망이 있습니다.
정말 고마워요! 토큰은 NAME, STRING, DATA, <, >,, /> 및 =이므로 가정은 정확합니다. 마지막 질문 하나 : LR (1) 문법입니까? 즉, LL (1) 및 LR (1) 구문 분석에 대해 여기에 제공 한 것과 동일한 문법을 사용할 수 있습니까? –
LL 문법도 LR입니다. – Slava
또한 Kleene 별을 명백하게 확장하면 원래의 문법은 LR (1)이됩니다.LR (k) 문법은 왼쪽 재귀에 아무런 문제가 없습니다. – rici