8

これはかなり単純なはずです。ANTLR を使用してレクサー文法に取り組んでおり、変数識別子の最大長を 30 文字に制限したいと考えています。私はこの行でこれを達成しようとしました(通常の正規表現に従います - '' のものを除いて - 構文):

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

コード生成にエラーはありませんが、生成されたコードの次の行が原因でコンパイルが失敗しました。

0,29

明らかに、antlr は括弧の間のテキストのセクションを取得し、それを印刷行とともに受け入れ状態領域に配置しています。ANTLR サイトを検索しましたが、同等の表現の例や参照は見つかりませんでした。この式の構文は何ですか?

4

1 に答える 1

9

{m,n}ANTLR は量指定子の構文をサポートしていません。ANTLR は{}量指定子の を認識し{}、アクションを囲む と区別することはできません。

回避策:

  1. 意味的に制限を適用します。無制限のサイズの ID を収集してから、アクション コードの一部として、または後でコンパイラで不平を言う/切り捨てます。
  2. 数量化ルールを手動で作成します。

これは、ID を 8 つに制限する手動ルールの例です。

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

個人的には、セマンティック ソリューション (#1) を使用します。最近では、言語の識別子を制限する理由はほとんどなく、そのような規則に違反したときに構文エラー (コンパイルの早期中止) を引き起こす理由はさらに少なくなっています。

于 2012-08-30T03:08:41.450 に答える