从 Bison 打印一个 XML 文件

Print from Bison an XML file

我对如何从 Bison 进行打印感到有点困惑。我有一个项目,我必须将一个带有文本的文件作为输入并检查它是否正确 XML。我已经在 Bison 中编写了 BNF,如果正确的话,我想在 stdout 中打印输入文件中的文本。我知道我也可以从 flex 打印它,但这不是我们被要求做的 project.This 是我的 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();};

在问题末尾添加的规则是一种以文本顺序而不是自下而上解析器典型的 post 顺序遍历生成输出的可能方法。

然而,它有几个问题:

首先,yylval在任何中规操作中都没有意义。标记的语义值只能用 $n 引用来引用。

其次,在编写 $n 引用时,请记住中间规则操作本身也算作符号。所以 </code> 指的是第二个中间规则动作,而不是 <code>INTEGER 标记(即 )。