テンプレートエンジンをコンパイルするパーサー/レクサーを作成したいと思います。PHP_ParserGeneratorとPHP_LexerGeneratorを使用しています。彼らのドキュメントで説明されているように、私はレクサーを作成し、それが機能しています。しかし、パーサーを書き込もうとしたとき、私はまだ彼らの文書を理解していません。レモンパーサーのドキュメントを読みましたが、コードが機能しません。:(
レクサー/パーサーの「Helloworld」を含むこの例を見つけ、XenForo、vBulletin、Smartyのパーサー/レクサーを読みました。「Helloworld」の例では単純ですが、Xenforoで行われているように文法規則をグループ化しようとするとTAG_OPEN tag_attributes TAG_SELF_CLOSE
、パーサーが正しく機能しません。
/* 0 */ "start ::= in",
/* 1 */ "in ::= in PLAIN_TEXT",
/* 2 */ "in ::= in curly",
/* 3 */ "in ::= in tag",
/* 4 */ "in ::= in TAG_COMMENT",
/* 5 */ "in ::= in TAG_CLOSE",
/* 6 */ "in ::=",
/* 7 */ "tag ::= TAG_OPEN tag_attributes TAG_SELF_CLOSE",
/* 8 */ "tag ::= TAG_OPEN tag_attributes TAG_END",
/* 9 */ "tag_attributes ::= tag_attributes TAG_ATTRIBUTE DOUBLE_QUOTE quoted_inner DOUBLE_QUOTE",
/* 10 */ "tag_attributes ::= tag_attributes TAG_ATTRIBUTE SINGLE_QUOTE quoted_inner SINGLE_QUOTE",
これはSmartyのyファイルです:smarty_internal_templateparser.y
Xenforoと同じように文法規則をグループ化する方法を理解するのを手伝ってくれませんか。