2009-08-14 20 views
1

假設我有一個像處理Lex中的錯誤條件而不是Yacc?

[aA][0-9]{2,2}[pP][sS][nN]? { return TOKEN; } 

如果用戶輸入法正則表達式

A75PsN 
A75PS 

它將匹配

但是,如果一個用戶說像

A75PKN 

我希望它錯誤,並說「字符K未被識別,期待S 「

什麼我現在所做的一切只是寫它像

let [a-zA-Z] 
num [0-9] 

{let}{num}{2,2}{let}{2,3} 

然後基本上是重新詞法在Yacc的繩子,讓我能有有意義的錯誤條件

我怎樣才能解決這個?

我能想到的唯一事情就是使用命名組?

回答

2

哇!有趣的計劃。

如果您要在詞法分析器中檢測到這種情況,則必須有一個處理「任何不能識別的字符串」的catch-all規則並生成錯誤消息。

確定這是造成麻煩的K將是地獄。

[^aA][0-9]{2,2}[pP][sS][nN]? { report_error(); return ERROR; } 
[aA][0-9]{2,2}[^pP][sS][nN]? { report_error(); return ERROR; } 
[aA][0-9]{2,2}[pP][^sS][nN]? { report_error(); return ERROR; } 
[aA][0-9]{2,2}[pP][sS][^nN] { report_error(); return ERROR; } 

請注意放置插入符號,並且沒有問號! 處理非數字或數字過多或數字太少 - 呃!

一般情況下,你會認識到所有的「標識符」,然後確認哪些是OK的更好:

[a-zA-Z][0-9]{2,2}[a-zA-Z]{2,5} { return validate_id_string(); } 

選擇你的毒藥你允許進入的驗證例程;它決定輸入的內容是否正確,並且它的返回值控制Lex規則返回到語法。這也是區分關鍵字和標識符的一種方法。

概括並簡化正則表達式以適應真正發生的事情。

+0

Wow很棒的迴應。不應validate_id_string()是否像validate_id_string(yytext)?通過yytext驗證? – DevDevDev 2009-09-30 18:13:32

+0

@DevDevDev:因爲yytext是全局的,所以傳遞yytext是可選的。它部分取決於你是否在其他地方使用該功能。是的,參數比全局變量更好。但我正在說明一般技術,而不是一些好的編碼風格。 – 2009-09-30 19:47:33

+0

謝謝!我沒有試圖評論編碼風格,我只是想知道你的意思是validate_id_string會訪問yytext。 – DevDevDev 2009-09-30 23:02:04