2014-02-05 21 views
1

我想用這個成語:兩個有關彈性簡單的問題/ C

yy_scan_string(line); 
    int i; 
    while ((i = yylex())) 
     .... 

,其中這兩個功能都是在我的主C文件柔性產生lex.yy.c中定義。到目前爲止,我是

#including "lex.yy.c" 

但它似乎魚腥味。我該如何做到正確的C方式? 其次,我想我的.L文件的最後一行,

.     { return WORD; } 

不再返回一個「字」的道理,而是返回其輸入。對於爲例(它是一個短小Linux外殼)

ls > ls.txt 

目前返回2個WORD令牌,更大的令牌,以及6個WORD令牌,當我想「LS」大於「ls.txt」的返回。當然,yylex()只能返回一個類型,那麼獲得所需結果的可接受方式是什麼?

謝謝。

+0

您必須聲明**函數(並稍後將實現文件鏈接在一起)。您不需要包含.c文件以便使用它們中定義的功能。 – 2014-02-05 17:37:18

+0

你可以使用'。 {return * yytext; }'返回被讀取的字符。那麼你會在語法中使用''<''。不推薦,但你可以做到。 –

回答

1

您可以使用--header-file=<filename>命令行選項或在flex源代碼中包含%option header-file="<filename>"來指示flex生成頭文件以及C源文件。我通常調用flex有:

flex --header-file=file.h -o file.c file.l 

(其實,我用make規則生成一個這樣的命令,但是這想法。)然後就可以#include "file.h"在需要調用一個柔性功能的源文件。

通常,yylex返回令牌類型(整數)。全局變量yytext包含一個指向標記字符串本身的指針,這可能足以滿足您的需要。但是,請在flex手冊中閱讀"A Note About yytext And Memory"。 (總結:如果您需要保存yytext的值,您必須複製一份;建議使用strdup。不要忘記在不再需要時免費拷貝)

有時候,標記字符串本身並不完全是您想要的語義值。按照慣例,flex動作將令牌的語義值放置在全局yylval中,這是生成的解析器將查找它的位置。然而,yylval沒有被flex生成的代碼聲明,所以你需要自己包含一個聲明,無論是在flex生成的代碼還是包含它的任何源文件中。 (如果使用bison生成解析器,則bison將生成此聲明並將其放入它生成的頭文件中。)

+0

非常感謝。這些工具看起來非常有用,但是對於我的能力水平來說有點高級,而且你真的幫助了! – pouzzler