2009-08-14 10 views
1

私は、ユーザーがYaccではなくLexでエラー状態を処理していますか?

A75PsN 
A75PS 

を入力した場合、ユーザは、私が

A75PKN 

のようなものを言う場合、それは

でもマッチします

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

のようなlexの正規表現を持っていると仮定それがエラーになり、「キャラクターKが認識されず、S私は、私は周りを取得することができますどのように意味のあるエラー条件に

を持つことができるように、Yaccの中の文字列を今だけ

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

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

ようにそれを書いている。そして、基本的に再字句やっている何を「

この?

私が考えることができるのは名前付きグループを使用することだけです。

答えて

2

うわー!面白い計画。

字句解析ツールでそれを検出する場合は、「認識できない文字列」を扱うcatch-allルールを設定し、エラーメッセージを生成する必要があります。

問題の原因となったのは地獄であると判断しています。

[^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(); } 

はあなたの毒を選択してください。入力されたものがOKかどうかを判断し、戻り値がLexルールが文法に戻すものを制御します。これは、キーワードと識別子を区別する1つの方法です。

正規表現を一般化して単純化して、実際に何が起きているのかに合わせてください。

+0

すごい素晴らしいレスポンス。 validate_id_string()はvalidate_id_string(yytext)のようにするべきではありませんか?検証するためにyytextを渡しますか? – DevDevDev

+0

@DevDevDev:yytextはグローバルなので、yytextを渡すことはオプションです。関数を他の場所で使用するかどうかによって部分的に異なります。はい、パラメータはグローバルより優れています。しかし、私は一般的な技術を説明していました。いいコーディングスタイルの細かいことではありません。 –

+0

ありがとう!私はあなたがvalidate_id_stringがyytextにアクセスすることを意味していたかどうか疑問に思っていたコーディングスタイルについてコメントしようとしていませんでした。 – DevDevDev

関連する問題