2010-07-20 99 views
0

我正在嘗試構建一個簡單的詞法分析器,用於(科學)C程序的簡單輸入輸出庫。當使用自動工具,包括automake的,libtool的,和autoconf編譯,我得到以下錯誤:與flex文件編譯錯誤

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

這通常意味着我已經忘記了在函數原型的末尾分號,但我已經檢查了我標題,並沒有這樣的疏忽。

這裏的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; 
} 

Emacs中*compilation*緩衝超鏈接指向我的%}%在序言的結尾。爲什麼我得到這個錯誤?我也沒有稱爲「的」的符號。

謝謝,

喬爾

+0

您是不是想要用Adobe Flex來標記它? – JeffryHouser 2010-07-20 12:50:41

+0

沒有他的意思是真正的flex,但是一般來說,標記爲gnu-flex,所以會刪除'flex'標籤。 – 2010-07-20 14:18:01

+0

謝謝西蒙 - 我不知道Adobe Flex有這樣的事情。 – 2010-07-20 16:36:07

回答

2

問題是懸空評論,我摺疊到一個線本身,這樣的:

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

第二行被直接複製到所述源,沒有評論分隔符。看來flex對於評論和格式化來說相當挑剔。錯誤消息中提到的「of」是評論第二行的第一個單詞。

問題是我必須查看派生的.c文件,而不是在超鏈接指向我的.l文件中。這是轉化來源:

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

從這個由柔性處理的文件中:

%{ 
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 */ 

謝謝! Joel