2012-02-15 61 views
3
/*Regular Definitions*/ 
delim[\t\n] 
WS{delim}+ 
letter[A-Za-z] 
digit[0-9] 
id{letter}({letter|digit})* 
number{digit}+(\.{digit}+?(E[+-]?{digit}+)? 

%% 
{WS}{/*do nothing*/} 
if{printf("\nIF found");return 0;} 
then{printf("\nTHEN found");return 0;} 
else{printf("\nELSE found");return 0;} 
{id}{printf("\nID found");return 0;} 
{number}{printf("\nNUMBER found");return 0;} 
"<"{printf("\nLess than symbol found.");return 0;} 
"<="{printf("\nLess than or Equals to symbol found.");return 0;} 
"="{printf("\nEquals to symbol found.");return 0;} 
"<>"{printf("\nNot equals to symbol found.");return 0;} 
">"{printf("\nGreater than symbol found.");return 0;} 
">="{printf("\nGreater than or equal to symbol found.");return 0;} 
%% 

雖然使用Flex編譯此錯誤與Flex工具

G:\>flex Lex.l 

我收到以下錯誤:

"Lex.l", line 14: unrecognized rule 

"Lex.l", line 14: unrecognized rule 

"Lex.l", line 14: unrecognized rule 

"Lex.l", line 14: unrecognized rule 

"Lex.l", line 14: unrecognized rule 

"Lex.l", line 27: EOF encountered inside an action 

誰能幫助我呢?

謝謝。

+0

我編輯了問題補充編譯代碼標籤之間的誤差。它更容易閱讀。 – Birei 2012-02-15 15:27:38

回答

3

1.-環繞括號表示交替的每個表達式。

{letter}|{digit} 

2.-在number定義中錯過了一個圓括號。我在第一個?之前添加了它,但不確定。

number{digit}+(\.{digit}+)?(E[+-]?{digit}+)? 

3.-在規則部分,用空格分隔模式和C代碼。

{WS}  {/*do nothing*/} 

這應該工作,或至少編譯:

/*Regular Definitions*/ 
delim[\t\n] 
WS{delim}+ 
letter[A-Za-z] 
digit[0-9] 
id{letter}({letter}|{digit})* 
number{digit}+(\.{digit}+?(E[+-]?{digit}+)?) 

%% 
{WS}  {/*do nothing*/} 
if   {printf("\nIF found");return 0;} 
then  {printf("\nTHEN found");return 0;} 
else  {printf("\nELSE found");return 0;} 
{id}  {printf("\nID found");return 0;} 
{number} {printf("\nNUMBER found");return 0;} 
"<"   {printf("\nLess than symbol found.");return 0;} 
"<="  {printf("\nLess than or Equals to symbol found.");return 0;} 
"="   {printf("\nEquals to symbol found.");return 0;} 
"<>"  {printf("\nNot equals to symbol found.");return 0;} 
">"   {printf("\nGreater than symbol found.");return 0;} 
">="  {printf("\nGreater than or equal to symbol found.");return 0;} 
%% 
+0

感謝上面的代碼的確編譯,但是當我嘗試編譯c文件時,使用Dev-cpp得到以下錯誤: [鏈接器錯誤]未定義的引用'yywrap' [鏈接器錯誤]未定義對'yywrap' [鏈接器錯誤]對'WinMain @ 16'的未定義引用 ld返回1退出狀態 – vs2010noob 2012-02-15 15:41:50

+0

@ vs2010noob:在我的linux中,一切正常:'flex lex.l && cc -o exe lex.yy.c -lfl'。確保鏈接到flex庫。 – Birei 2012-02-15 16:09:10