我对如何从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);};
答案 0 :(得分:0)
问题末尾添加的规则是一种可能以文本顺序生成输出的方法,而不是自底向上解析器所特有的后序遍历。
但是,它存在几个问题:
首先,yylval
在任何规则中的动作中都没有意义。令牌的语义值只能使用$n
引用进行引用。
第二,在编写$n
引用时,请记住,中间规则动作本身就算作符号。因此,$4
是指第二个规则中的操作,而不是INTEGER
令牌(即$7
)。