質問
次の構造を解析できるようにしたい:
blah
{
"string-1",
"string-2",
...,
"string-n"
}
トークン化にflexを使用していますが、それは完全に機能しています。解析にyacc(バイソン)を使用しています。
この構造を許可する推奨方法は何ですか?今、私のtest.yファイルには、次のものがあります:
blah_command:
BLAH OPEN_BRACE string_list CLOSE_BRACE
{
printf( "String list is %s\n", $3 );
}
string_list: /* empty */
|
STRING
{
return $1;
}
|
STRING COMMA string_list
{
strcat($1, ",");
strcat($1, $3);
}
strcat()は本当に悪い考えだと思います。 lex / yacc(経験3時間程度)に関しては私は本当の初心者なので、手首を軽く叩き、正しい方向にポインターを向けることは素晴らしいことです。
編集:この目的は、外部アプリケーション用のテストハーネスを構築できるようにすることです。字句解析/解析は、ユーザーが提供するテストスクリプトの解釈に使用されます。 1つのコマンドを使用すると、ユーザーはアプリケーションにメッセージを送信できます。その後、複数行の応答を読み取り、ユーザーがスクリプトで提供した可変長リストの文字列と比較します。上記のフラグメントは、ユーザーに可能な応答を定義させると思った方法です。
例:
blah
{
"COMMAND EXECUTED CORRECTLY"
}
または
blah
{
"QUERY COMPLETE IN .0034 SECONDS",
"1 RECORD FOUND:",
"FOO=12345",
"--END OF LIST--"
}
解決
これを印刷するだけであれば、strcat()はすべての文字列を接続するために正常に動作します。
通常、パーサーは抽象的な構文ツリーを構築します。したがって、文字列を出力する代わりに、次のようなものがあります。
Node* n = new_node(STRING_LIST_NODE); // STRING_LIST_NODE being an enum node type
n->value = $1
n->next = $3
$ = n;
他のヒント
この例では、単に入力を出力しているだけなので、strcatは問題ありません。
通常、やろうとしていることは、抽象的な構文ツリーを構築することです。 ASTの場合、ノード構造を作成するか、コンテンツを配列にマッピングできます。
プログラムの目標についてさらに詳しく説明する場合は、より詳細な回答をお送りします。
所属していません StackOverflow