2012-12-08 4 views
5

Cスタイルの単一行コメントを理解する小さな言語の文法を書いた。ここで Antlrを使った単線Cスタイルコメントの解析

// this is a comment 

コメントは、スクリプトの最後で、ときを除き、ANTLRのV3.0.1に作品の

SINGLELINE_COMMENT 
: '/' '/' (options {greedy=false;} : ~('\r' | '\n'))* ('\r' | '\n')+ {$channel=HIDDEN;}; 

    WS  :  (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;}; 

これはかなりの種類を使用して、私は、この言語のために書いた文法の断片であります私はこのメッセージを取り除くことができますどのように

line 1:20 required (...)+ loop did not match anything at character '<EOF>' 

:なし終了NL/CRはありません、私は(実行時に)ANTLRから迷惑なメッセージを得ましたか。私は(..)+式にEOFトークンを追加しようとしましたが、これは動作しません。

+0

私はこれについては分かりませんが、改行をオプションにすると、つまり '+'を '?'に変更するとどうなりますか?あるいは '*'でしょうか? – nijoakim

+0

欲張りのオプションを省いて(+のみそのように見えますが)、プラス記号を疑問符に変更します。 –

答えて

4

greedy=...オプションは不要です。ルールに.*または.+が含まれている必要があります。あなたはすでにあなたのWSルールで隠しチャネルに改行文字を入れているので、あなたはあなたのSINGLELINE_COMMENTからそれを削除することができます。一般的には

SINGLELINE_COMMENT 
: '//' ~('\r' | '\n')* {$channel=HIDDEN;} 
; 

WS 
: (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;} 
; 
+0

うまく動作します、ありがとう! – insitu

2

を、の多くを伴うだろう「何の終了NL」の問題を解決しませんこのエッジ条件に対応するために、曲がりくねった文法の変更があります。入力ストリームの終わりにNLを追加するだけで、NLを終端させることができ、文法で心配する必要はありません。これに関してUNIXは正しいですし、Windowsはそうではありません。

問題の解決方法ではありませんが、ルールを最初にコーディングした方法でこの問題が発生します。

関連する問題