私はこれまでしばらくの間これに固執してきました。レモンLALRパーサーのためのシンプルな文法
が好き:として私はシンプルなものを解析したい単語1ワード2 ... wordNは嫌い:単語1 WORD2 .. wordN
私はレモン+フレックスを使用しています。現時点で私の文法は次のようになっています:
%left LIKES MOODS FROM HATES INFO.
%syntax_error {
std::cout << "Syntax error!" << std::endl;
}
final ::= likes_stmt.
final ::= hates_stmt.
likes_stmt ::= LIKES list(A). { Data *data=Data::getInstance();data->likes.push_back(A);}
hates_stmt ::= HATES list(A). { Data *data=Data::getInstance();data->hates.push_back(A);}
list ::= likes_stmt VALUE(A). { Data *data=Data::getInstance();data->likes.push_back(A);}
list ::= hates_stmt VALUE(A). { Data *data=Data::getInstance();data->hates.push_back(A); }
list(A) ::= VALUE(B). {A=B;}
しかし、これは最初の2単語だけで動作します。明らかに私は間違ったことをしています、おそらく再帰的な定義ですか?どのヘッドアップも高く評価されています:)
通常、これを行う方法は最初に解析し、ツリーを後処理してさまざまなカテゴリに情報を収集します。そうすれば、人工的な制作物( "set_likes"など)で文法を混乱させることはありません。その仕事は、 "while-parsing"アクションに信号を送ることだけです。より複雑な言語では、これらのシグナルはほとんど文法を混乱させ、構文解析を仕事と混同するため、悲しみを生み出します。しかし、これが*すべて* OPが行う必要がある場合、この答えは問題ありません。 (upvoteありがとう!) –