0

次の構造を解析できるようにしたいと思います。

blah
{
    "string-1",
    "string-2",
    ...,
    "string-n"
}

私はフレックスを使用してトークン化していますが、それは完全に機能しています。解析には yacc (bison) を使用しています。

この構造を許可するための推奨される方法は何ですか? 現在、私の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--"
}
4

2 に答える 2

1

これを印刷するだけなら、strcat() は正常に動作し、すべての文字列を結合します。

ただし、通常、パーサーは抽象構文ツリーを構築します。したがって、文字列を出力する代わりに、次のようになります。

Node* n = new_node(STRING_LIST_NODE); // STRING_LIST_NODE being an enum node type
n->value = $1
n->next = $3
$$ = n;
于 2009-09-14T06:36:55.597 に答える
0

あなたの例では、単に入力を出力しているだけなので、strcat は問題ありません。

典型的には、抽象的な構文ツリーを構築しようとします。AST の場合、ノード構造を作成するか、コンテンツを配列にマップできます。

プログラムの目標について詳しく教えていただければ、より詳細な回答を差し上げることができます。

于 2009-09-14T06:34:48.970 に答える