Распечатать из Bison XML-файл - PullRequest
       12

Распечатать из Bison XML-файл

0 голосов
/ 17 сентября 2018

Я немного озадачен тем, как печатать из Бизона.У меня есть проект, в котором я должен взять файл с текстом в качестве входных данных и проверить, является ли он правильным как XML.Я написал BNF в Bison, и я хотел бы напечатать текст из входного файла в стандартный вывод, если он правильный.Я знаю, что могу также распечатать его с флекса, но это не то, что нас просят сделать в проекте. Это часть моего БНФ:

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.

"<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);};

1 Ответ

0 голосов
/ 18 сентября 2018

Правило, добавленное в конце вопроса, является возможным способом получения вывода в текстовом порядке, а не в порядке пост-порядка, типичном для анализатора снизу вверх.

Однако он страдает от нескольких проблем:

Во-первых, yylval не имеет смысла ни в одном из действий среднего правила. Семантические значения для токенов должны указываться только с помощью $n ссылок.

Во-вторых, когда вы пишете ссылки $n, помните, что действия среднего правила сами по себе считаются символами. Таким образом, $4 относится ко второму действию среднего правила, а не к токену INTEGER (то есть $7).

...