1

Antlr 定義言語を使用して Java エディターで文字列を入力すると、最初の引用符 (") を入力するとすぐにエラーが発生します。

入力:

    StatusString = ";
    break;

エラー:

java.lang.IllegalStateException: Lexer com.lexer.IpIdeLexer@5ab38d6b
  returned null token but lexerInput.readLength()=21
  lexer-state: null
  tokenStartOffset=557, readOffset=578, lookaheadOffset=579
  Chars: "";\n        break;\n}\n\n" - these characters need to be tokenized.
Fix the lexer to not return null token in this state.

文法で文字列リテラルをどのように定義したかが原因だと思います。

文法の定義

STRING_LITERAL
    :  '"' ( EscapeSequence | ~('\\'|'"') )* '"' {setText(getText().substring(1,    getText().length()-1));}
    ;

fragment
EscapeSequence
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   OctalEscape
    ;

最初の引用が表示されるとすぐに、文字列を抽出しようとしていると思われます。これは、レクサーを使用して構文を色分けする IDE であるため、リアルタイムで行われます。このエラーを防ぐために文法でできることはありますか?

編集:私が考えていたのは、行末までチェックすることでした。IDE は、netbeans や eclipse のように、ユーザーが引用を完了するまで、引用から始まる行をオレンジ色にします。文法を介してこれを行う方法がわからないので、レクサー/パーサーに反映されます

4

1 に答える 1

1

エラーを回避しようとすると、最初の引用符を入力したときだけでなく、どこかで引用符を本当に忘れた場合にもエラーを見逃すことになります。

IDE を数ミリ秒 (1/2 秒程度) 待機させて、終了引用符を入力する時間を確保するか、IDE に終了引用符を自動的に挿入させることで、これを解決できますか?

無効な入力も許可するように文法を調整しようとするのは良い考えではありません.

于 2012-07-10T19:51:12.650 に答える