【发布时间】:2012-12-24 17:45:54
【问题描述】:
我正在尝试制作一个像 C 一样的编译器。我将我的语法输入到 antlrWorks IDE 中,它没有显示任何错误,但是当我想查看我的规则的语法图时,它抱怨“无法显示规则 'xxxxx',因为未找到启动状态”。我没有找到任何特殊的方法来定义示例上的开始符号。我把我的语法放在这里可能有人可以帮助我:
grammar MiniC;
tokens {
GET='get';
PUT='put';
CHANGE='change';
DATA='data';
METADATA='metadata';
DEPENDENCIES='dependencies';
DEPENDENTS='dependents';
STATISTICS='statistics';
FROM='from';
IN='in';
ABOUT='about';
OF='of';
MAIN='main()';
ID = 'ID';
SEMI = ';';
INT ='int';
VOID = 'void';
BOOL ='BOOL';
FLOAT = 'FLOAT';
IF = 'if';
ELSE = 'else';
RETURN = 'return';
BREAK ='break';
WHILE ='while';
};
program
: MAIN compound_stmt
;
compound_stmt
:
'{' local_declarations stmt_list'}'
;
local_declarations
:
() (var_declarations)*
;
var_declarations
:
type_specifier ID SEMI
|
type_specifier ID [('0'..'9')*]
;
type_specifier
:
'int'
|
'void'
|
'bool'
|
'float'
;
stmt_list
:
(stmt)*
;
stmt :
expression_stmt
|
compound_stmt
|
selection_stmt
|
iteration_stmt
|
return_stmt
|
break_stmt
;
selection_stmt
: IF('('expression')') compound_stmt
|
IF('('expression')') compound_stmt ELSE compound_stmt
;
iteration_stmt
:
WHILE ('('expression')') compound_stmt;
return_stmt
:
RETURN SEMI|RETURN expression;
break_stmt
: BREAK;
expression_stmt
:
expression;
expression
: var '=' simple_expression|simple_expression;
simple_expression
:
operand operator operand;
operand :
('1'..'9')
|
;
var :
ID|ID[('1'..'9')*];
operator
:
RelOp|LogicOp|ArithOp;
RelOp :
'<='|'<'|'>='|'>'|'!='|'==' ;
LogicOp :
'&&'|'||'
;
ArithOp :
'+'|'-'|'*'|'/'|'%';
WS
:) (' '|'\t'|'\n'|'\r')+ {skip();}
;
【问题讨论】:
-
语法远非“真实”,我真的不相信 ANTLRWorks 在生成词法分析器和解析器时不会抱怨。浏览您的语法时,我发现至少有 4 个错误。您使用的是哪个版本的 ANTLRWorks?真的是您发布的语法,还是您发布了不同版本的语法?
-
@BartKiers,实际上是的,这个语法包含很多错误。但是 AntlrWorks 中的错误 'cannot display rule 'x....' 由于分号被显示在 'tokens {...}' 描述之后。
-
好吧,这就是我的意思:语法不是“正确的”……你现在解决了吗?
-
不,直到现在我还没有发现我的语法错误。正如 Andremonity 所说,我省略了分号,但 antlrworks 没有显示错误。我正在使用 antlr 3.5-rc-2 和 antlrworks 1.5
标签: compiler-construction antlr antlrworks