2012-08-30 10 views
7

これはかなりシンプルなはずです。 私はANTLRを使ってレクサー文法に取り組んでおり、可変識別子の最大長を30文字に制限したいと考えています。私は( - 「」のものを除いて - 通常の正規表現次の構文)この行でこれを実現しようとした:コード生成中ANTLR正規表現の範囲限定子の構文

ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,29} {System.out.println("IDENTIFIER FOUND.");} 
    ; 

エラーなし、しかし、コンパイルは単純だった生成されたコードの行のため失敗しました:

0,29

明らかANTLRは、括弧の間のテキストの部分を取って、印刷ラインと共に受け入れる状態の領域に置くれます。私はANTLRサイトを検索しましたが、同等の表現の例も参照も見つかりませんでした。 この式の構文はどのようにすべきですか?

答えて

8

ANTLRは、{m,n}限定子の構文をサポートしていません。 ANTLRでは、限定数量の{}が表示され、あなたの行動を囲む{}とは区別できません。

回避方法:

  1. 意味的制限を適用。無制限のサイズのIDを集めて、それをあなたのアクションコードの一部として、またはコンパイラの後のところでそれに文句を付ける/切り捨てさせます。
  2. 定量ルールを手動で作成します。

このは個人8

SUBID : ('a'..'z'|'A'..'Z'|'0'..'9'|'_') 
     ; 
ID : ('a'..'z'|'A'..'Z') 
    (SUBID (SUBID (SUBID (SUBID (SUBID (SUBID SUBID?)?)?)?)?)?)? 
    ; 

にIDを制限する手動ルールの一例であり、Iは、セマンティック溶液で行くだろう(#1)。最近では、言語の識別子を制限する理由はほとんどなく、そのような規則に違反したときに構文エラー(コンパイルの早期終了)が発生する理由はほとんどありません。

+0

ありがとうございました。 – user1634761

+1

ANTLRがプログラミング言語のコンパイラを生成するためにのみ使用された場合、数量化のための使用はほとんどありません。しかし、あらゆる種類の構造化データを検証するための文法(スキーマ)が必要です。クレジットカード番号は13または25ではなく16桁です。ANTLR4の本はJSONとXMLの文法を持っていますが、基本的なトークン制約がないと、 JSONスキーマとXSDの抽象(コーデックに依存しない)バージョンとしてのANTLR文法。 – Dave

+0

「最近、言語の識別子を制限する理由はほとんどありません」ということは、限定された識別子を持つ言語が存在しないことや、パーサーを書くことを望んでいないことを意味するわけではありません。 –