2014-09-10 3 views
0

Кажется, что у меня возникают проблемы с SableCC, генерирующим соответствующие элементы лексера, узла и анализа, которые он обычно автоматически генерирует из файла грамматики. На данный момент я не внедряю абстрактное синтаксическое дерево.Проблемы с файлом грамматики SableCC

Когда я пытаюсь запустить SableCC с файлом грамматики ниже, я получаю следующее сообщение об ошибке:

[41,33] Переопределение AFunctionHead.Id. Я знаю, в чем проблема, но, похоже, это что-то в области производства. Может, я чего-то не хватает?

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; 

ответ

2

Это объясняется в SableCC documentation, магистерская AKA Etienne Gagnon диссертация:

Unlike alternatives, elements have an obvious candidate for name which is the identifier of the element itself. This will work, as long as an element does not appear twice in the same alternative. In that case the current version SableCC requires a name for at least one of the two elements. (For backward compatibility, one occurrence of the repeated element can remain unnamed). SableCC will issue an error if not enough names are provided. Element names are specified by prefixing the element with an identifier between square brackets followed by a colon.

Другими словами, вы не можете использовать id дважды в производстве для function_head, не давая по крайней мере, один из них имя (независимо от того, генерируете ли вы AST).

попробовать что-то вроде этого:

function_head = func id l_par [parameter]:id r_par; 
+0

Большое спасибо :) Я думаю, что мне удалось разобраться вопросы: D – Curiosity

 Смежные вопросы

  • Нет связанных вопросов^_^