2015-04-22 113 views
0

我已經鑄成法文件,如下所示它:如何檢查輸入法作爲一個單一的輸入

%% 
[\t\n] 
"if" {printf("IF_TOKEN\n");} 
"else" {printf("ELSE_TOKEN\n");} 
"while" {printf("WHILE_TOKEN\n");} 
"FOR" {printf("FOR_TOKEN\n");} 
"BREAK" {printf("BREAK_TOKEN\n");} 
"float" {printf("FLOAT_TOKEN\n");} 
"int" {printf("INT_TOKEN\n");} 
"long" {printf("LONG_TOKEN\n");} 
"return" {printf("RETURN_TOKEN\n");} 
"defFunction" {printf("DEFFUNCTION_TOKEN\n");} 
"defClass" {printf("DEFCLASS_TOKEN\n");} 
"\(" {printf("PAROPEN_TOKEN\n");} 
"\)" {printf("PARCLOS_TOKEN\n");} 
"\{" {printf("CBROPEN_TOKEN\n");} 
"\}" {printf("CBRCLOS_TOKEN\n");} 
"<" {printf("LESSTHN_TOKEN\n");} 
">" {printf("GRTRTHN_TOKEN\n");} 
"=" {printf("EQUALTO_TOKEN\n");} 
"!=" {printf("NEQUALTO_TOKEN\n");} 
"\+" {printf("SUM_TOKEN\n");} 
"-" {printf("MINUS_TOKEN\n");} 
"\*" {printf("STAR_TOKEN\n");} 
"\/" {printf("SLASH_TOKEN\n");} 
"%" {printf("REMAIN_TOKEN\n");} 
"\[" {printf("BRAOPEN_TOKEN\n");} 
"\]" {printf("BRACLOS_TOKEN\n");} 
";" {printf("SEMICOL_TOKEN\n");} 
[-]?[1-9][0-9]* {printf("NUMBER\n");} 
[A-Za-z&_$][A-Za-z$_]* {printf("ID\n");} 
. {printf("ERROR");} 

%% 
int yywrap (void) { 
return 1; 
} 
int main (int argc, char** argv) { 
    yylex(); 
    return 0; 
} 

,如果我給125apple作爲輸入這個文件法編譯.L文件後,應該打印錯誤,但它打印 NUMBER ID 我怎樣才能給125apple作爲單一的輸入?

回答

1

在很多語言中,這正是125apple會如何操作的原因,部分原因在於這是一種天真的lex掃描儀定義的工作方式。

如果你想要它是一個錯誤,你需要明確地將它作爲一個錯誤,通過添加一個模式,將匹配錯誤的令牌。通過將它放在符合有效數字的模式之後,可以避免在與兩個模式匹配的輸入上觸發錯誤,因此錯誤模式也可以匹配有效令牌。這使得寫起來更容易一些。

0|[-]?[1-9][0-9]* {printf("NUMBER\n");} 
[-]?[0-9]+[0-9A-Za-z_]* {printf("ERROR\n");} 
[A-Za-z&_$][A-Za-z$_]* {printf("ID\n");} 

上面,我做了一個小的變化:您的號碼模式不承認0,所以我加了它。

錯誤行不僅可以捕獲125apple。它還捕獲其他錯誤的標記,如0037-0。 (我不相信-0應該是一個錯誤;您可能想要修復該錯誤。)它不會將123$apple視爲錯誤,因此您可能也想更改它。

+0

它應該是一個錯誤,因爲我想我的變量couldnt可以開始與數字。當我給emad /作爲輸入,它給了我ID SLASH_TOKEN和所有格式。我不認爲它應該有必要寫錯誤模式對於所有這些格式,我應該如何?如果我可以說每個沒有空間的輸入都是單個輸入,它應該正常工作 – EmadSmart

+0

@EmadSmart:您的選擇。 「因爲我想要它」是一個完全有效的解釋。請記住,下次你問自己爲什麼你使用的某種語言的工作原理:) – rici

+0

這僅僅是爲了我的學習,它不是一種真正的語言,125e也不能成爲一個有效的變量名C++,可以嗎? – EmadSmart

相關問題