2010-07-20 7 views
0

J'essaie de construire un analyseur lexical simple pour accompagner une simple bibliothèque de sortie d'entrée pour les programmes C (scientifiques). Lors de la compilation avec autotools, y compris automake, libtool et autoconf, je reçois l'erreur suivante:Erreur de compilation avec le fichier flexible

simpleio_lex.l:41: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘of’ 

Cela signifie généralement que je l'ai oublié un point-virgule à la fin d'un prototype de fonction, mais je l'ai vérifié mon en-tête et il n'y a pas une telle omission.

Voilà simpleio_lex.l:

%{ 
int yylex(void); 
#define yylex sio_lex 
#include "simpleio.h" 
%} 

NUM [0-9]   /* a number */ 
FLOAT {NUM}+"."{NUM}*   /* a floating point number */ 
FLOATSEQ {FLOAT[[:space:]]?}+ 
FLOATLN ^FLOATSEQ$ 
SYMBOL [a-z]+   /* a symbol always comes at the 
        beginning of a line */ 
SYMDEF ^SYMBOL[[:space:]]*FLOAT /* define a single value for a symbol */ 
RANGE FLOAT":"FLOAT":"FLOAT /* a range of numbers */ 
SYMRANGE ^SYMBOL[[:space:]]+RANGE$ /* assign a range of values to a symbol */ 

%% 
       /* a set of lines with just numbers 
        indicates we should parse it as data */ 
{FLOATLN}+ sio_read_stk_inits (yytext); 
SYMDEF sio_read_parse_symdef (yytext); 
SYMRANGE sio_read_parse_symrange (yytext); 
%% 

/* might as well define these here */ 
sio_symdef_t * 
sio_read_parse_symdef (char * symdef) 
{ 
    sio_symdef_t * def = malloc (sizeof (sio_symdef_t)); 
    /* split the string into tokens on the LHS and RHS */ 
    char * delim = " "; 
    char * lvalue = strtok (symdef, delim); 
    size_t lsize = sizeof (lvalue); 

    char * rest = strtok (NULL, delim); 
    double plval;   /* place holder */ 
    int s_ck = sscanf (rest, "%lg", &plval); 
    if (s_ck == EOF) 
    return NULL; 
    else 
    { 
    def->value = plval; 
    def->name = malloc (lsize); 
    memcpy(def->name, lvalue, lsize); 
    } 
    return def; 
} 

Le lien tampon *compilation* Emacs me réfère à la %}% à la fin du préambule. Pourquoi ai-je cette erreur? Je n'ai pas non plus de symbole appelé "de".

Merci,

Joel

+0

Vouliez-vous marquer avec Adobe Flex? – JeffryHouser

+0

Non, il voulait dire le vrai flex, mais SO généralement tags que gnu-flex, donc va supprimer «flex» tag. –

+0

Merci Simeon - Je ne savais pas qu'il y avait une telle chose comme Adobe Flex. –

Répondre

2

Le problème était un commentaire ballants que je croisai sur une ligne par lui-même, comme ceci:

/* this is a comment that's going to run into a 
    new line */ 

La deuxième ligne a été copiée directement dans la source, sans son délimiteur de commentaire. Il semble que Flex soit plutôt pointilleux sur les commentaires et le formatage. Le "de" mentionné dans le message d'erreur est le premier mot de la deuxième ligne du commentaire.

Le problème est que j'ai dû regarder dans le fichier .c dérivé, pas dans le fichier .l où le lien hypertexte me dirigeait. Ceci est la source transformé:

#line 38 "simpleio_lex.l" 
int yylex(void); 
#define yylex sio_lex 
#include <simpleio.h> 
beginning of a line */ 
#line 505 "simpleio_lex.c" 

De ce dans le fichier traité par flex:

%{ 
int yylex(void); 
#define yylex sio_lex 
#include <simpleio.h> 
%} 


NUM [0-9]   /* a number */ 
FLOAT {NUM}+"."{NUM}*   /* a floating point number */ 
FLOATSEQ {FLOAT[[:space:]]?}+ 
FLOATLN ^FLOATSEQ$ 
SYMBOL [a-z]+   /* a symbol always comes at the 
        beginning of a line */ 

Merci! Joel