title: Problems With SableCC Grammar File
body: <p>I seem to be having issues with SableCC generating the relevant lexer, node and parse stuff that it normally automatically generates from a grammar file. I'm not implementing an Abstract Syntax Tree at the moment. </p>
  
  <p>When I try to run SableCC with the grammar file below, I get the following error:</p>
  
  <p><strong>[41,33] Redefinition of AFunctionHead.Id.</strong> I have know idea what the problem is, but it seems to be something in the productions area. Am I perhaps missing something?</p>
  
  <pre><code>Package Grammar_Specification;
  
  Helpers
  
    digit = ['0'..'9'];
    letter = (['a'..'z'] | ['A'..'Z']);
    underscore = '_';
    plus = '+';
    minus = '-';
    mult = '*';
    div = '/';
    equals = '=';
    l_par = '(';
    r_par = ')';
    l_curly = '{';
    r_curly = '}';
    unicode_input_character = [0..0xffff];
    lf  = 0x000a;
    cr  = 0x000d;
    line_terminator =  lf | cr | cr lf;
    input_character = [unicode_input_character - [cr + lf]];
    not_star = [input_character - '*'] | line_terminator;            
    not_star_not_slash = [input_character - ['*' + '/']] | line_terminator;
    multi_line_comment = '/*' not_star+ '*'+ (not_star_not_slash not_star* '*'+)* '/';
    line_comment = '//' input_character* line_terminator?;
  
  Tokens
  
    func = 'FUNC';
    id = (letter(letter | digit | underscore)* | underscore(letter | digit | underscore)*);
    float_literal = minus? digit (digit)* ('.' (digit)*)? (('e' | 'E') (plus | minus)? digit (digit)*)?;
    whitespace = (' ' | '\t' | '\n' | '\r')+;
    comment = multi_line_comment | line_comment;
  
  Productions
  
    program = function_decl*statement*;
  
    function_decl = function_head function_body;
  
    function_head = func id l_par id r_par;
  
    function_body = l_curly statement* r_curly;
  
    statement = id equals expression;
  
    expression = expression plus term |
               expression minus term |
               term;
  
    term = term mult factor |
           term div factor |
           factor;
  
    factor = l_par expression r_par |
             identifier l_par expression r_par |
             float_literal |
             id;
  </code></pre>