【问题标题】:Format output of Flex/BisonFlex/Bison 的格式输出
【发布时间】:2023-03-07 07:13:01
【问题描述】:

我正在使用 Flex 和 Bison 来分析 JSON。这就是我的 Flex 的样子:

%%

[ \n\t]+    
true        { return VAL_TRUE; }
false       { return VAL_FALSE; }
null        { return VAL_NULL; }
{STRING}    { yylval->string = strdup(yytext); return STRING; }
{NUMBER}    { yyval->number = atof(yytext); return NUMBER; }
\{          { return OBJ_BEG; }
\}          { return OBJ_END; }
:           { return SYM_COLON; }
,           { return SYM_COMMA; }

%%

我在 Bison 中有这样的语法:

%%

START:      OBJECT                      { printf("%s\n", $1); }
    ;

OBJECT:     OBJ_BEG OBJ_END             { $$ = "{}\n"; }
    |       OBJ_BEG MEMBERS OBJ_END     { 
                                            $$ = ALLOC(2+strlen($2)+2); 
                                            sprintf($$,"{ %s }",$2); 
                                        }
    ;

MEMBERS:    PAIR                        { $$ = $1; }
    |       PAIR SYM_COMMA MEMBERS      { 
                                            $$ = ALLOC(strlen($1)+2+strlen($3)); 
                                            sprintf($$,"%s, %s",$1,$3); 
                                        }
    ;

PAIR:       STRING SYM_COLON VALUE      { 
                                            $$ = ALLOC(strlen($1)+2+strlen($3)); 
                                            sprintf($$,"%s: %s",$1,$3); 
                                        }
    ;

...

VALUE:      STRING                      { $$ = yylval.string; }
    |       NUMBER                      { $$ = yylval.number; }
    |       OBJECT                      { $$ = $1; }
    |       ARRAY                       { $$ = $1; }
    |       VAL_TRUE                    { $$ = "true"; }
    |       VAL_FALSE                   { $$ = "false"; }
    |       VAL_NULL                    { $$ = "null"; }
    ;

%%

使用所有这些我试图识别 JSON。我还通过添加一些逗号、括号和空格来格式化输入。

但我遇到的问题是如何保存输入 JSON 中的所有换行符“\n”和制表符“\n”并将它们直接发送到输出?现在我在 Flex 的 "[ 'n\t]+" 中忽略它们,然后在一些 Bison 的操作中手动添加空格。

这是我正在考虑的方法:

我可以在 Flex 中识别“\n”和“\t”,并将它们作为 SYM_LINEBREAK 或 SYM_TAB 转发给 Bison。但是我如何将它们添加到 Bison 操作的输出中,我在哪里放置这些规则/操作?

简要说明我需要做什么:添加一些空格、换行符和制表符以输出并保存输入文件中的换行符和制表符(但不是空格)。

提前致谢!

【问题讨论】:

    标签: parsing bison flex-lexer


    【解决方案1】:

    空格与 JSON 语法无关——输入中的任意两个标记之间可能会出现任意数量的无关换行符或制表符,并且它不会影响 json 的含义(只要它不分解令牌)。所以对于 recognizingparsing json,你想像你正在做的那样忽略它。

    所以问题是,你想做什么?如果您只想将输入复制到输出而不做任何更改,则根本不需要解析器。如果你想删除所有虚假的空白,你可以做你正在做的事情,但那是矫枉过正。如果您想从 json 构建对象树(不是您当前正在做的事情),那么您需要像您一样的解析器,但您应该创建对象树而不是字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多