5

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;};

コメントがスクリプトの最後にあり、終了する NL/CR がない場合を除いて、これはほとんど機能します。antlr から (実行時に) 迷惑なメッセージが表示されます。

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

このメッセージを消すにはどうすればよいですか? EOF式にトークンを追加しようとしました(..)+が、これは機能しません。

4

2 に答える 2

4

このオプションは必要ありません。通常、またはルールにgreedy=...ある場合に必要です。また、ルールの隠しチャネルに改行文字を既に配置しているため、次のように削除できます。.*.+WSSINGLELINE_COMMENT

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

WS 
 : (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;}
 ;
于 2012-12-08T09:11:50.987 に答える
3

一般に、「no terminating NL」の問題を解決するには、このエッジ条件に対応するために多くの曲がりくねった文法の変更が必要になります。入力ストリームの末尾に単に NL を追加する方が常に簡単です。つまり、終端 NL があることが保証され、文法でそれについて心配する必要がなくなります。UNIX はこの点で正しく、Windows は正しくありません。

特定の問題の解決策ではありませんが、最初にルールをコーディングした方法でこの問題が明らかになります。

于 2012-12-10T03:18:59.753 に答える