2012年12月20日木曜日

ANTLR C# 『名前 'HIDDEN' は現在のコンテキスト内に存在しません。』

ANTLRでC#用パーサ、レキサーを以下の環境で作っています。


ANTLRWorks:
 1.5rc1 (1.4.3からアップデート案内された)
  http://www.antlr.org/download.html
 
Runtime:
 Antlr3.Runtime.dll 3.4.1.9004
  http://www.antlr.org/wiki/display/ANTLR3/Antlr3CSharpReleases 
(以下3つはもしかするとAntlr3.Tuntime.dllに一本化されて不要かも)
 antlr.runtime.dll  3.1.3     
 Antlr3.Utility.dll  3.1.3
 StringTemplate.dll 3.1.3
  http://www.antlr.org/download/CSharp2/

統合開発環境:
 VisualStudio2012

ターゲット言語:
 language=CSharp3;



書きだした***Lexer.csと***Parser.cs、ランタイムDLLをVisualStudioプロジェクトで読み込み、ビルドすると、

 『名前 'HIDDEN' は現在のコンテキスト内に存在しません。』

とエラーが出ます。エラーが出ている部分は以下のようなコードで
 _channel=HIDDEN;

これはANTLRWorksで{$channel=HIDDEN;}と書いていると書き出されるコードです。
デフォルトのWSルール中にありますね。

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


{$channel=HIDDEN;}と書くと、このレキサールールに当てはまったトークンは無視されるようになるそうです。
WhiteSpace? タブや改行やスペースなので、無視する設定になってるのは当然ですね。



しかしHIDDENだとエラーになってしまうし、HIDDENの定義はどこに行ってしまったんだと思ったら、Antlr3.Runtime.dll 3.4.1.9004では、名前が”Hidden”に変更されているようです。
 public const int Hidden = 99;

エラー部分を以下にように書きなおしてあげればOKのようです。
_channel=Hidden;