【发布时间】: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