質問

次の構造を解析できるようにしたい:

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の場合、ノード構造を作成するか、コンテンツを配列にマッピングできます。

プログラムの目標についてさらに詳しく説明する場合は、より詳細な回答をお送りします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top