从Bison打印XML文件

时间:2018-09-17 14:39:57

标签: xml printing bison

我对如何从Bison打印感到有些困惑。我有一个项目,其中我必须以文本为输入的文件,并检查它是否正确为XML。我已经用Bison编写了BNF,如果正确,我想从标准输出中的输入文件中打印文本。我知道我也可以从flex中打印它,但这不是我们在项目中要做的。这是我的bnf的一部分:

WORKBOOK: WORKBOOK_START INWORKBOOK WORKBOOK_END ;

INWORKBOOK: WORKSHEET MORE_WORKSHEETS | NUM_STYLES WORKSHEET MORE_WORKSHEETS ;

MORE_WORKSHEETS: WORKSHEET MORE_WORKSHEETS | ;

NUM_STYLES: STYLES NUM_STYLES | ;

STYLES: STYLES_START INSTYLES STYLES_END ;

INSTYLES: STYLE INSTYLES | ;

STYLE: STYLE_START INSTYLE STYLE_END ;

INSTYLE: id CLOSE_TAG ;

id: ID EQUAL QUOTES STRING QUOTES ;

WORKBOOK_START,WORKBOOK_END等是我要打印的终端令牌。 这是我的Flex代码的一部分,以及如何从flex进行打印。

"<ss:Workbook>"     {printf("%s",yytext); yylval.string = strdup(yytext);return WORKBOOK_START;}
"</ss:Workbook>"    {printf("%s",yytext); yylval.string = strdup(yytext);return WORKBOOK_END;}
"<ss:Styles>"       {printf("\t%s",yytext); yylval.string = strdup(yytext);return STYLES_START;} 

等。有什么想法吗? 这是我有问题的规则,并且由于未检测到类型而收到错误消息。 id: ID {printf("%s",yylval.string);} EQUAL {printf("%s",yylval.string);} QUOTES {printf("%s",yylval.string);} INTEGER {printf("%s",yylval.string);} QUOTES {printf("%s",yylval.string); checkID($4);};

1 个答案:

答案 0 :(得分:0)

问题末尾添加的规则是一种可能以文本顺序生成输出的方法,而不是自底向上解析器所特有的后序遍历。

但是,它存在几个问题:

首先,yylval在任何规则中的动作中都没有意义。令牌的语义值只能使用$n引用进行引用。

第二,在编写$n引用时,请记住,中间规则动作本身就算作符号。因此,$4是指第二个规则中的操作,而不是INTEGER令牌(即$7)。