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

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小时的体验),我是一个真正的新手,所以在手腕上拍一个指针并指向正确的方向会很棒。

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

例如:

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