我似乎对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;发布于 2014-09-10 16:10:40
这一点在SableCC文档,也就是tienne Gagnon的硕士论文中作了解释:
与其他选项不同,元素有一个明显的候选名称,即元素本身的标识符。只要一个元素在相同的选项中不会出现两次,这将是可行的。在这种情况下,当前版本的SableCC至少需要两个元素之一的名称。(为了向后兼容性,重复元素的一次出现可以保持未命名)。如果没有提供足够的名称,SableCC将发出错误。元素名称是通过在方括号之间加上标识符的元素前缀加上冒号来指定的。
换句话说,您不能在id的生产过程中两次使用function_head,除非至少给其中一个命名(不管您是否生成AST)。
试着做这样的事情:
function_head = func id l_par [parameter]:id r_par;https://stackoverflow.com/questions/25769828
复制相似问题