title: ANTLR: How to skip multiline comments
body: <p>Given the following lexer:</p>
  
  <pre><code>lexer grammar CodeTableLexer;
  
  @header {
      package ch.bsource.ice.parsers;
  }
  
  CodeTabHeader   : OBracket Code ' ' Table ' ' Version CBracket;
  CodeTable       : Code ' '* Table;
  EndCodeTable    : 'end' ' '* Code ' '* Table;
  Code            : 'code';
  Table           : 'table';
  Version         : '1.0';
  Row             : 'row';
  Tabdef          : 'tabdef';
  Override        : 'override' | 'no_override';
  Obsolete        : 'obsolete';
  Substitute      : 'substitute';
  Status          : 'activ' | 'inactive';
  Pkg             : 'include_pkg' | 'exclude_pkg';
  Ddic            : 'include_ddic' | 'exclude_ddic';
  Tab             : 'tab';
  Naming          : 'naming';
  Dfltlang        : 'dfltlang';
  Language        : 'english' | 'german' | 'french' | 'italian' | 'spanish';
  Null            : 'null';
  Comma           : ',';
  OBracket        : '[';
  CBracket        : ']';
  
  Boolean
      : 'true' 
      | 'false'
      ;
  
  Number
      : Int* ('.' Digit*)?
      ;
  
  Identifier
      : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '$' | '#' | '.' | Digit)*
      ;
  
  String
  @after {
      setText(getText().substring(1, getText().length() - 1).replaceAll("\\\\(.)", "$1"));
  }
      : '"' (~('"'))* '"'
      ;
  
  Comment
      : '--' ~('\r' | '\n')* { skip(); }
      | '/*' .* '*/' { skip(); }
      ;
  
  Space
      : (' ' | '\t') { skip(); }
      ;
  
  NewLine
      : ('\r' | '\n' | '\u000C') { skip(); }
      ;
  
  fragment Int
      : '1'..'9'
      | '0'
      ;
  
  fragment Digit 
      : '0'..'9'
      ;
  </code></pre>
  
  <p>... and the following parser:</p>
  
  <pre><code>parser grammar CodeTableParser;
  
  options {
      tokenVocab = CodeTableLexer;
      backtrack = true;
      output = AST;
  }
  
  @header {
     package ch.bsource.ice.parsers;
  }
  
  parse
      : block EOF
      ;
  
  block
      : CodeTabHeader^ codeTable endCodeTable
      ;
  
  codeTable
      : CodeTable^ codeTableData
      ;
  
  codeTableData
      : (Identifier^ obsolete?) (tabdef | row)*
      ;
  
  endCodeTable
      : EndCodeTable
      ;
  
  tabdef
      : Tabdef^ Identifier+
      ;
  
  row
      : Row^ rowData
      ;
  
  rowData
      : (Number^ | (Identifier^ (Comma Number)?))
          Override?
          obsolete?
          status?
          Pkg?
          Ddic?
          (tab | field)*
      ;
  
  tab
      : Tab^ value+
      ;
  
  field
      : (Identifier^ value) | naming
      ;
  
  value
      : OBracket? (Identifier | String | Number | Boolean | Null) CBracket?
      ;
  
  naming
      : Naming^ defaultNaming (l10nNaming)*
      ;
  
  defaultNaming
      : Dfltlang^ String
      ;
  
  l10nNaming
      : Language^ String?
      ;
  
  obsolete
      : Obsolete^ Substitute String
      ;
  
  status
      : Status^ Override?
      ;
  </code></pre>
  
  <p>... finally my class for making the parser case-insensitive:</p>
  
  <pre><code>package ch.bsource.ice.parsers;
  
  import java.io.IOException;
  import org.antlr.runtime.*;
  
  public class ANTLRNoCaseFileStream extends ANTLRFileStream {
  
      public ANTLRNoCaseFileStream(String fileName) throws IOException {
  
          super (fileName, null);
      }
  
      public ANTLRNoCaseFileStream(String fileName, String encoding) throws IOException {
  
          super (fileName, null);
      }
  
      public int LA(int i) {
  
          if (i == 0) return 0;
          if (i &lt; 0) i++;
          if ((p + 1 - 1) &gt;= n) return CharStream.EOF
          return Character.toLowerCase(data[p + 1 - 1]);
      }
  }
  </code></pre>
  
  <p>... single-line comments are skipped as expected, while multi-line comments aren't... here is the error message I get:</p>
  
  <pre><code>codetable_1.txt line 38:0 mismatched character '&lt;EOF&gt;' expecting '*'
  codetable_1.txt line 38:0 mismatched input '&lt;EOF&gt;' expecting EndCodeTable
  java.lang.NullPointerException
  ...
  </code></pre>
  
  <p>Am I missing something? Is there anything I should be aware of? I'm using antlr 3.4.</p>
  
  <p>Here is also the example source code I'm trying to parse:</p>
  
  <pre><code>[code table 1.0]
  
  /*
  This is a multi-line comment
  */
  
  code table my_table
  
  -- this is a single-line comment
  row 1
      id              "my_id_1"
      name            "my_name_1"
      descn           "my_description_1"
      naming
        dfltlang      "My description 1"
        english       "My description 1"
        german        "Meine Beschreibung 1"
  
  -- this is another single-line comment
  row 2
      id              "my_id_2"
      name            "my_name_2"
      descn           "my_description_2"
      naming
        dfltlang      "My description 2"
        english       "My description 2"
        german        "Meine Beschreibung 2"
  
  end code table
  </code></pre>
  
  <p>Any help would be really appreciated :-)</p>
  
  <p>Thanks,
  j3d</p>