Ваш вопрос спрашивает о PHP_ParserGenerator и PHP_LexerGenerator . Код генератора синтаксического анализатора помечен как «не поддерживается», что сулит ничего плохого.
Синтаксис, который вы используете для грамматики, неприемлем для Lemon, поэтому вам нужно уточнить, почему вы думаете, что генератор парсера должен его принять. Вы упомянули проблему с 'ожидалось, что <name>
будет следовать за двойным двоеточием, но ни в вашей грамматике, ни в вводе сэмпла нет двоеточия, что затрудняет вам помощь.
Я думаю, что эта грамматика Лимона эквивалентна той, которую вы показали:
document ::= rule_list.
rule_list ::= .
rule_list ::= rule_list rule.
rule ::= selector LBRACE content_list RBRACE.
content_list ::= .
content_list ::= content_list content.
content ::= rule.
content ::= definition.
definition ::= NAME COLON NAME SEMICOLON.
selector ::= NAME opt_dothashlist opt_colonname.
opt_dothashlist ::= .
opt_dothashlist ::= dot_or_hash NAME.
dot_or_hash ::= DOT.
dot_or_hash ::= HASH.
opt_colonname ::= COLON NAME.
Однако, когда он скомпилирован, Лимон жалуется 1 parsing conflicts
, а в выходном файле отображается:
State 2:
definition ::= NAME * COLON NAME SEMICOLON
selector ::= NAME * opt_dothashlist opt_colonname
(10) opt_dothashlist ::= *
opt_dothashlist ::= * dot_or_hash NAME
dot_or_hash ::= * DOT
dot_or_hash ::= * HASH
COLON shift 10
COLON reduce 10 ** Parsing conflict **
DOT shift 13
HASH shift 12
opt_dothashlist shift 5
dot_or_hash shift 7
Это означает, что он не уверен, что делать с двоеточием; это может быть часть opt_colonname селектора или часть определения:
name1:name4 : name2:name3 ;
Вы хотели разрешить такой синтаксис? Номинально, согласно грамматике, это должно быть действительным, но
name1:name4;
также должно быть действительным. Я думаю, что для устранения этих неоднозначностей требуется 2 или 3 жетона предпросмотра (поэтому ваша грамматика не LALR (1), а LALR (3)).
Просмотрите, в частности, ваше определение «селектор».