2017-03-27 8 views
1

私はコンパイラを作るために勉強し、一つの文字列のようないくつかのルール持っている:マルチストリングの正規表現とは何ですか?

char ch[] ="abcd"; 

とマルチストリング:

printf("This is\ 
a multi\ 
string"); 

私はそれが動作する正規表現

STRING \"([^\"\n]|\\{NEWLINE})*\" 

を書きました1行の文字列では問題ありませんが、1行が'\'文字で終了する複数行の文字列では機能しません。 変更する必要はありますか?

+0

なぜ、より読みやすい '\ n'ではなく、{NEWLINE}(値が表示されない)という定義を使用していますか?それはあなたのコードを読みにくくし、質問を答えるのが難しくなります。なぜなら、おそらく不必要な定義のエラーと関係している可能性があるからです。また、文字クラスの中で引用符をエスケープする必要もありません( '[...]')。 – rici

+0

これまで私のコードでは、NEWLINE \ nというルールを書いていました。だから私が必要としたところでは、私はNEWLINEを書きました。そして、私は文字クラスの中で引用符をエスケープする必要はありません。 – sphoenix

+0

あなたのコードを書く方法は、もちろんあなたの決断です。しかし、定義を使用する場合は、それをあなたの質問に含める必要があります。それ以外の場合、実際の定義がどのようにわかるでしょうか?質問のコードは自己完結型でなければなりません。定義が正しければ、正規表現もそうであり、問​​題はあなたの入力の末尾の空白と関係している可能性があります。あなたのルールの他の場所でも、それはちょっと奇妙なことですが。 [mcve]を提供する方が常に良いです。 – rici

答えて

0

共通文字列パターンは、これはエスケープされた二重引用符(\")とバックスラッシュ(\\)が含まれた文字列にマッチします

\"([^"\\\n]|\\(.|\n))*\" 

です。 \\(.|\n)を使用して、バックスラッシュの後の任意の文字を許可します。一部のバックスラッシュシーケンスは1文字(\x40)よりも長いですが、最初の文字の後に英数字以外の文字は含まれていません。

入力にWindowsの行末(CR-LF)が含まれている可能性があります。この場合、バックスラッシュに改行が直接続くことはありません。キャリッジリターンが続きます。あなたは(より適切であるかもしれない)ではなく、エラーを投げるよりも、その入力を受け付けるようにしたい場合は、明示的に実行する必要があります。

\"([^"\\\n]|\\(.|\r?\n))*\" 

しかし、文字列が何を表すかの文字列と理解を認識は、二つの異なるものです。通常、コンパイラは、文字列の表現をバイトシーケンスに変換する必要があります。たとえば、\nをバイト10に変換し、バックスラッシュした改行を削除する必要があります。

このタスクは、開始条件を使って(f)lexスキャナで簡単に実行できます。 (もちろん、別の字句スキャナを使用して文字列を再スキャンすることもできます)。

また、エラー処理について考える必要があります。エスケープされていない改行(Cのように)で文字列を禁止すると、終了文字の前に改行がある未終端の文字列の可能性があります。文字列が正しく閉じられていなければ、ファイルの最後にも同じことが起こります。

1文字のフォールバックルールがある場合、終了していない文字列の開始引用符を認識します。これは、文字列の内容をプログラム・テキストとしてスキャンして、カスケード・エラーにつながるため好ましくありません。エラーリカバリを試行していない場合は、問題はありませんが、そうでない場合は、少なくとも改行文字まで、異なるパターンを使用して、終端されていない文字列を認識してください。

+0

printf( "abc \ def \ ghi");正しい出力がされます。この入力用 は トークン語彙素のprintfは トークン語彙素は( "\ DEF \ GHI ABC" が見つかりましたが、あなたの表現と、それは TOKEN 語彙素のprintfが TOKENを見つけ生成 トークン語彙素を発見しました語彙素( TOKEN 語彙素ABCは TOKEN 語彙素はDEF "([^"] TOKEN 語彙素GHIは、終端されていない文字列\のため – sphoenix

+0

を見つけた見つけた|。\\)*これは正常に動作します – sphoenix

+0

@sphoenix:もしそれがあなたが得たものなら、二重引用符が消えているのでテストハーネスに何か問題があります。 – rici

関連する問題