2017-10-15 9 views
0

J'essaie d'identifier un jeton entier en utilisant flex et yacc. C'est ma syntaxe de fichier flex pour les entiers.Jeton entier utilisant flex et yacc

%{ 
#include "main.h" 
#include "y.tab.h" 
#include <stdlib.h> 
#include <string.h> 
#define YYSTYPE char * 
void yyerror(char *); 
%} 

code   "code" 
special   ":" 
turn   "turn" 
send   "send" 
on    "on" 
pin    "pin" 
for    "for" 
num    "[0-9]+" 

%% 
{code}   {return CODE;} 
{special}  {return SPECIAL; } 
{turn}   {return OPRTURN;} 
{send}   {return OPRSEND;} 
{on}   {return OPRON;} 
{pin}   {return PORT;} 
{for}   {return FOR;} 
{num}   { yylval.iValue = atoi(yytext); return INTEGER;} 
%% 

int yywrap(void) { 
return 1; 
} 

dans le fichier yacc ..

%{ 
    #include "main.h" 
    #include <stdio.h> 
    #include <stdarg.h> 
    #include <stdlib.h> 
// char *name[10]; 

void startCompiler(); 

/* prototypes */ 
nodeType *enm(char* c); 
nodeType *opr(int oper,int nops,...); 
nodeType *id(int i); 
nodeType *con(int value); 
nodeType *cmd(char *c); 

void freeNode(nodeType *p); 
int ex(nodeType *p); 
int yylex(void); 

void yyerror(char *s); 
//int sym[26];     /* symbol table */ 
%} 

%union { 
    int iValue;     /* integer value */ 
    char sIndex;    /* symbol table index */ 
    char *str;    /* symbol table index */ 
    nodeType *nPtr;    /* node pointer */ 
}; 

%token <iValue> INTEGER 

%token CODE SPECIAL OPRTURN OPRSEND OPRON PORT FOR 
%type <nPtr> stmt stmt_list oper operation duration pin location 



%% 

input : function { exit(0);} 
     ; 

input : function { exit(0);} 
     ; 

function : function stmt { ex($2); freeNode($2);} 
     | 
     ; 

stmt : 

     | PORT location   { printf("Port taken"); } 
     ; 


location : INTEGER { printf("Number is %d",$1); } 

       ; 

mais quand j'exécute le programme, il ne reconnaît pas le numéro,

entrée est

broche 4

Sortie

sortie doit être

Numéro de port est pris 4

Qu'est-ce que je manque ici? Tous les autres jetons fonctionnent correctement.

Merci d'avance.

+0

Veuillez publier suffisamment de code pour exécuter le code et reproduire le problème. Également être plus clair sur ce que l'entrée, la production réelle et la production attendue. Est-ce que l'entrée "pin 4" et la sortie "4"? Et le résultat attendu serait "Nombre pris" et rien d'autre? – sepp2k

+0

@ sepp2k J'ai ajouté les codes complets. effectivement ce que je dois identifier est mon code obtient «pin 4» et identifier la broche et le numéro. Ensuite, je peux utiliser ce numéro pour un traitement ultérieur dans mon code C. – Sachith

+0

Je ne suis toujours pas clair sur ce que votre entrée, la sortie réelle et la sortie attendue sont. Je ne vois pas comment la sortie peut être "4", il n'y a rien dans votre code qui imprime juste un nombre sans texte supplémentaire. – sepp2k

Répondre

1

La sortie obtenue est la sortie de la fonction yyerror, qui imprime par défaut uniquement les jetons invalides sur stderr. Ce qui se passe, c'est que "pin" est correctement reconnu, mais "4" ne l'est pas. La règle d'instruction ne génère donc aucune sortie car elle attend toujours un entier. Donc, la seule sortie est celle de yyerror.

La raison pour laquelle il ne reconnaît pas 4 est que vous avez cité l'expression rationnelle pour les nombres sous la forme d'un littéral de chaîne. Donc, il cherche la chaîne littérale "[0-9] +". Supprimez les guillemets pour qu'ils soient interprétés comme une regex. PS: Vous souhaiterez également ajouter une règle qui ignore les espaces ou vous devrez entrer pin4 sans espaces.

+0

Oui, c'était mon erreur. Merci beaucoup @ sepp2k – Sachith