0

我希望能够解析以下结构:

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

我正在使用 flex 进行标记,并且效果很好。我正在使用 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 小时的经验)时,我是一个真正的新手,所以在手腕上轻轻一拍,以及指向正确方向的指针会很棒。

编辑:这样做的目的是让我为外部应用程序构建测试工具。词法分析/解析将用于解释用户提供的测试脚本。一个命令允许用户向应用程序发送消息,然后我读取多行响应并与用户在脚本中提供的可变长度字符串列表进行比较。我在上面发布的片段是我认为让用户定义可能的响应的方式。

例如:

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 回答