2013-05-05 113 views
1

我寫了一個簡單的lex程序來執行正數的平均值,程序編譯正常,但我無法獲得預期的輸出。我將輸入傳遞給程序文件通過給文件名作爲命令行參數。lex程序的輸出是空的,顯示沒有結果,我是lex的初學者,任何幫助將不勝感激。我附上了下面的代碼。該代碼是用redhat linux內核版本2.4編寫的。來自lex程序的意外輸出

%{ 
#include <stdio.h> 
#include <stdlib.h> 
%} 

%% 
[0-9]+ return atoi(yytext); 
%% 

void main() 
{ 
    int val, total = 0, n = 0; 
    while ((val = yylex()) > 0) { 
    total += val; 
    n++; 
} 
if (n > 0) printf(「ave = %d\n」, total/n); 
} 

輸入文件包含數字3,6和4,文件的名稱作爲命令行參數傳遞。

./a.out < input 

回答

2

您的程序適用於我。我有點懷疑yywrap失蹤,所以你可能會鏈接-lfl(或類似的東西)選項。該庫包含一個yywrap和一個main。即使我無法重現您所看到的內容,但我仍然很謹慎,可能使用libfl中的main。我假設你在輸出的輸入文件中得到了任何換行符。不同的連接器有不同的方式來解決同一符號的多次出現。

總而言之,我認爲你必須以你的程序構建的方式來尋找問題,因爲規範似乎沒問題。如果您在main之後加上int yywrap(void) { return 1; },那麼您可以不用libfl,這是我建議任何用戶lexgnu-flex

+0

你好布賴恩,我在代碼中犯了一個錯誤,主代碼必須採用命令行參數,因此它應該被修改爲主(int argc,char * argv []),並且在修改後我可以得到o/p。我甚至介紹了檢查空格和製表符和o/p是好的。感謝您的幫助。 – 2013-05-08 00:48:26