Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SableCC语法文件的问题_Java_Grammar_Sablecc - Fatal编程技术网

Java SableCC语法文件的问题

Java SableCC语法文件的问题,java,grammar,sablecc,Java,Grammar,Sablecc,我似乎对SableCC生成相关的lexer、node和parse东西有问题,这些东西通常是从语法文件自动生成的。我现在没有实现抽象语法树 当我尝试使用下面的语法文件运行SableCC时,出现以下错误: [41,33]重新定义functionhead.Id.我知道问题出在哪里,但似乎是在制作领域。我是不是错过了什么 Package Grammar_Specification; Helpers digit = ['0'..'9']; letter = (['a'..'z'] | ['A'

我似乎对SableCC生成相关的lexer、node和parse东西有问题,这些东西通常是从语法文件自动生成的。我现在没有实现抽象语法树

当我尝试使用下面的语法文件运行SableCC时,出现以下错误:

[41,33]重新定义functionhead.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;
这在akaÉtienne Gagnon的硕士论文中得到了解释:

与备选方案不同,元素有一个明显的候选名称,即元素本身的标识符。只要一个元素在同一个备选方案中不出现两次,这将起作用。在这种情况下,当前版本的SableCC至少需要两个元素中的一个元素的名称。(为了向后兼容,重复元素的一次出现可以保持未命名)。如果没有提供足够的名称,SableCC将发出错误。元素名称是通过在元素前面加上一个标识符(位于方括号之间,后跟冒号)来指定的

换言之,在为
函数_head
制作时,如果不给其中至少一个名称(无论是否生成AST),则不能使用
id
两次

试着这样做:

function_head = func id l_par [parameter]:id r_par;
非常感谢:)我想我设法解决了这些问题