在制作XML解析器的过程中:
正如标题所示,我已记录了以下代码中所示的规则,但是flex似乎 miss 是一个特定的规则。经过几个小时的代码研究,我还没有找到解决方法。
弹性代码:
%{
#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
答案 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;}