2013-06-22 2 views
0

Я пытаюсь создать простой сканер с помощью Flex. Однако при использовании следующего кода я получаю несколько ошибок «непризнанного правила» в строках 23, 24 и 25. После изучения некоторых подобных примеров я все еще не могу найти ошибок при форматировании. Может ли кто-нибудь указать мне в правильном направлении?Ошибка при использовании Flex для создания сканера (нераспознанное правило)

%{ 
#include <stdio.h> 
#include "mylang3.tab.h" 
#include <stdlib.h> 
#include <string.h> 
#define OK 234 
#define ILLEGAL 235 
%} 

digit  [0-9] 
letter  [a-zA-Z] 
invalid_id [char|else|if|class|new|return|void|while] 
unsigned_int ({digit}+) 
INTEGER  ((+|-)?{unsigned_int}) 
all_chars [{letter}{digit}_] 
ID    ([({all_chars}{-}{digit})({all_chars})*]{-}{invalid_id}) 
special_char ["\n"|"\""|"\'"|"\0"|"\t"|"\\"] 
CHARACTER '([[:print:]]{-}["']{+}{special_char})' 


%% 
[a-zA-Z]+   printf("I have found a word %s\n", yytext); 
{ID}    printf("I have found an id %s\n", yytext);  //errors 
{INTEGER}   printf("I have found an integer %s\n",yytext); //errors 
{CHARACTER}   printf("I have found a char %s\n",yytext);  //errors 
char|else|if|class|new|return|void|while printf("I have found a reserved word %s\n",yytext); 
"+"|"-"|"*"|"/"|"{"|"}"|"("|")"|"["|"]"  printf("I have found an operator: %s\n", yytext); 
[" " \t\n]+     /* eat up whitespace */ 
.      printf("Unrecognized character: %s\n", yytext); 


%% 

/*int main(int argc, char** argv){ 
    int token; 
    int ok=1; 
    ++argv, --argc; 

    if (argc > 0) 
    yyin = fopen(argv[0], "r"); 
    else 
    yyin = stdin; 
    yylex(); 

    while((token =yylex())!=0){ 
     if(token==ILLEGAL){ printf("Illegal sequence\n"); ok=0; } 
    } 
    if(ok==0) printf("Encountered lexical errors\n"); 
    else printf("No lexical errors found\n"); 
    return 0; 
}*/ 

ответ

0

Вы можете использовать квадратные скобки для символов, а не для последовательностей символов. Поэтому вместо e. г.

all_chars [{letter}{digit}_] 

вам придется написать

all_chars ({letter}|{digit}|_) 

И вы не должны смешивать знаки трубные и квадратные скобки. [abc] означает то же самое, что и (a | b | c), но [a | b | c] неверно.