2015-12-18 2 views
-1

Я придумал ошибку «непризнанного правила» в Flex. Я прочитал несколько статей, но я не нашел решения для своей проблемы. Я попытался внести некоторые изменения в свой код, но ничто, кажется, не заставляет его работать (иногда эти изменения сделали его еще хуже). Я отправляю свой код ниже, надеясь, что решение будет найдено.Flex: ошибка непризнанного правила

Мой гибкий код:

%{ 
#include <stdio.h> 
%} 
VAR_DEFINER "var" 
VAR_NAME [a-zA-Z][a-zA-Z0-9_]* 
VAR_TYPE "real" | "boolean" | "integer" | "char" 
%% 
{VAR_DEFINER}    {printf("A keyword: %s\n", yytext);} 
{VAR_NAME} | ","{VAR_NAME} {printf("A variable name: %s\n", yytext);} 
":"      {printf("A colon\n");} 
{VAR_TYPE}";""\n"   {printf("The variable type is: %s\n", yytext);} 
"\n"{VAR_DEFINER}   {printf("Error: The keyword 'var' is defined once at the beginning.\n");} 
[ \t\n]+     /* eat up whitespace */ 
.       {printf("Unrecognized character: %s\n", yytext);} 
%% 
main(argc, argv) 
int argc; 
char** argv; 
{ 
++argv, --argc; 
if (argc > 0) 
yyin = fopen(argv[0],"r"); 
else 
yyin = stdin; 
yylex(); 
} 

ответ

0

Я нашел ответ на мой собственный. Я хотел бы опубликовать его, чтобы помочь любому, у кого может быть аналогичная проблема, на всякий случай.

Моя ошибка заключалась в том, что я оставил некотируемые пробелы среди терминов выражений или среди типов переменных в объявлении. Например, я написал VAR_TYPE «real» | "boolean" | "integer" | "char" вместо VAR_TYPE "real" | "boolean" | "integer" | "char" (без пробелов).

Итак, обратите внимание на все виды кронштейнов и пробелов !!!

Я надеюсь помочь!

1

Как вы писали в своем собственном ответе на свой вопрос, вы можете исправить ошибки, опасаясь пробелов.

Но основная проблема заключается в том, что вы пытаетесь позволить сканеру работать, что лучше делает синтаксический анализатор. Если вы хотите анализировать такие вещи, как var x boolean, то это не должно быть единственным токеном, обнаруженным сканером. Обычный и наиболее часто используемый подход заключается в том, чтобы сканер обнаружил три отдельных токена (var, x и boolean), а затем пусть анализатор группирует их в объявление переменной.

+0

спасибо! Но ... какие-либо указания по этому поводу? Кроме того, вы можете помочь мне решить следующую проблему: http://stackoverflow.com/questions/34375410/flex-how-to-define-a-term-to-be-the-first-one-at-the-beginning -of-a-lineexclus ??? –

+0

@ DimitrisBouloutas: Объяснение того, как работать со сканерами и анализаторами, вероятно, будет слишком длинным для ответа на переполнение стека, но любой учебник по компилятору или учебник компилятора объяснит это. Я посмотрю на этот другой вопрос. –

+0

Надеюсь найти что-то полезное для разбора в руководстве по Flex ... –

Смежные вопросы