Ошибка Flex (нераспознанное правило) при наличии правила - PullRequest
0 голосов
/ 15 сентября 2018

В процессе создания синтаксического анализатора XML:

Как следует из названия, я задокументировал правила, как показано в моем коде ниже, но flex, похоже, пропускает конкретное.После многих часов настройки кода и исследования я так и не нашел решение.

Ошибка: Ошибка Cmd Img

Код Flex:

%{
#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 голосов
/ 15 сентября 2018

Перечитывая вопрос, я думаю, что есть проблема терминологии. Правило равно

{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;}
...