规则存在时出现Flex(无法识别的规则)错误

时间:2018-09-15 17:23:35

标签: parsing bison flex-lexer

在制作XML解析器的过程中:

正如标题所示,我已记录了以下代码中所示的规则,但是flex似乎 miss 是一个特定的规则。经过几个小时的代码研究,我还没有找到解决方法。

错误:Cmd Error Img

弹性代码:

%{
#include "bison.tab.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void yyerror(char *);
int err;
%}

%option noyywrap
%option yylineno

string   [_a-zA-Z][_a-zA-Z0-9]*
digit    [0-9]
integer  {digit}+
boolean  "True" | "False"
text ({string}| )*

%%
.                          {printf("%s",yytext);}
{boolean}                  {yylval.booleanval  = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}
{integer}                  {return INT;}
{string}                   {return STRING;}

"<ss:Workbook>"                     { return WORKBOOK_ST_TAG;}
"</ss:Workbook>"                    { return WORKBOOK_END_TAG;}
"<ss:Styles>"                       { return STYLES_ST_TAG;}
"</ss:Styles>"                      { return STYLES_END_TAG;}
"<ss:Style"                         { return STYLE_ST_TAG;}
"</ss:Style>"                       { return STYLE_END_TAG;}
"ss:ID"                             { return ID_TAG;}
"<ss:Worksheet"                     { return WORKSHEET_ST_TAG;}
"ss:Name"                           { return NAME_TAG;}
"ss:Protected"                      { return PROTECTED_TAG;}
"</ss:Worksheet>"                   { return WORKSHEET_END_TAG;}
"<ss:Table"                         { return TABLE_ST_TAG;}
"</ss:Table>"                       { return TABLE_END_TAG;}
"ss:ExpandedColumnCount"            { return EXP_CC_TAG;}
"ss:ExpandedRowCount"               { return EXP_RC_TAG;}
"<ss:Column"                        { return COLUMN_OP_TAG;}
"/>"                                { return COLUMN_CL_TAG;}  
"ss:Width"                          { return WIDTH_TAG;}
"<ss:Row"                           { return ROW_ST_TAG;}
"</ss:Row>"                         { return ROW_END_TAG;}
"ss:Height"                         { return HEIGHT_TAG;}
"ss:Hidden"                         { return HIDDEN_TAG;}
"<ss:Cell"                          { return CELL_ST_TAG;}
"</ss:Cell>"                        { return CELL_END_TAG;}
"ss:MergeAcross"                    { return MERGE_A_TAG;}
"ss:MergeDown"                      { return MERGE_D_TAG;}
"ss:StyleID"                        { return STYLE_ID_TAG;}
"<ss:Data"                          { return DATA_ST_TAG;}
"</ss:Data>"                        { return DATA_END_TAG;}
"ss:Type="                          { return TYPE_TAG;}
"Number"                            { return NUM_ATTR;}
"String"                            { return STRING_ATTR;}
"Datetime"                          { return DATETIME_ATTR;}
"Boolean"                           { return BOOL_ATTR;}
"<!--"                              { return COMM_ST_TAG;}
"-->"                               { return COMM_END_TAG;}
[\t\n]+ ;
%%

我的野牛代码的一部分(令牌声明):

%token WORKBOOK_ST_TAG WORKBOOK_END_TAG
%token STYLES_ST_TAG STYLES_END_TAG
%token STYLE_ST_TAG STYLE_END_TAG
%token ID_TAG
%token WORKSHEET_ST_TAG WORKSHEET_END_TAG
%token NAME_TAG PROTECTED_TAG
%token TABLE_ST_TAG TABLE_END_TAG
%token EXP_RC_TAG EXP_CC_TAG
%token COLUMN_OP_TAG COLUMN_CL_TAG WIDTH_TAG
%token ROW_ST_TAG ROW_END_TAG
%token HEIGHT_TAG HIDDEN_TAG
%token CELL_ST_TAG CELL_END_TAG
%token MERGE_A_TAG MERGE_D_TAG
%token STYLE_ID_TAG
%token DATA_ST_TAG DATA_END_TAG
%token TYPE_TAG
%token NUM_ATTR STRING_ATTR DATETIME_ATTR BOOL_ATTR
%token INT DECIMAL STRING BOOLEAN DATETIME
%token COMM_ST_TAG COMM_END_TAG

1 个答案:

答案 0 :(得分:1)

重读该问题,我认为这是一个术语问题。 规则

{boolean}   {yylval.booleanval  = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}

与所有规则一样,该规则由* pattern“和一个动作组成。模式{boolean}仅由宏扩展组成。一旦扩展了宏,由于以下原因,该行将不再被视为规则宏定义中的空白,如我在下面的原始答案中所述:


如错误消息所指示,问题是伸缩文件第22行中的模式,该模式包含boolean的宏扩展:

boolean  "True" | "False"

无论是直接输入还是通过宏输入,Flex模式都不能包含无引号的空格。

如果您坚持使用宏,则可能是:

boolean  True|False

尽管没有什么阻止您将模式直接插入规则中

True|False   {yylval.booleanval  = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}