Compiler construction Antlr工作语法图不生成,尽管语法正确

Compiler construction Antlr工作语法图不生成,尽管语法正确,compiler-construction,antlr,antlrworks,Compiler Construction,Antlr,Antlrworks,我正在尝试制作一个类似C的编译器。我将语法输入antlrWorks IDE,它没有显示错误,但当我想查看规则的语法图时,它抱怨“无法显示规则‘xxxxx’,因为找不到启动状态”。我在示例中没有找到定义开始符号的特殊方法。我把我的语法放在这里,也许有人能帮我: grammar MiniC; tokens { GET='get'; PUT='put'; CHANGE='change'; DATA='data'; METADATA='metadata';

我正在尝试制作一个类似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();}
    ; 
语法MiniC;
代币{
GET='GET';
PUT='PUT';
CHANGE='CHANGE';
DATA='DATA';
元数据='METADATA';
依赖性=‘依赖性’;
家属='家属';
"统计",;
FROM='FROM';
IN='IN';
大约;
OF的;
MAIN='MAIN()';
ID='ID';
半=';';
INT='INT';
VOID=‘VOID’;
BOOL='BOOL';
浮动=‘浮动’;
如果='如果';
ELSE='ELSE';
RETURN='RETURN';
BREAK='BREAK';
WHILE='WHILE';
};
程序
:主要化合物
;
复合材料
:
“{”本地声明列表“}”
;
本地联合声明
:
()(var_声明)*
;
var_声明
:
类型\说明符ID
|
类型\说明符ID[('0'..'9')*]
;
类型说明符
:   
“int”
|
“无效”
|
“布尔”
|
“浮动”
;
stmt_列表
:
(stmt)*
;   
stmt:
表达式
|
复合材料
|
选择
|
迭代法
|
返回时间
|
中断
;
选择
:IF(“('expression')”)复合词
|
IF(“('expression')”)复合词
;
迭代法
:
而(“('expression')”)复合物_stmt;
返回时间
:
返回半|返回表达式;
中断
:中断;
表达式
:
表达方式;
表达
:var'='简单_表达式|简单_表达式;
简单表达式
:
操作数运算符操作数;
操作数:
('1'..'9')
|
;
变量:
ID | ID[('1'..'9')*];
操作人员
:       
RelOp | LogicOp | ArithOp;
重播:
''|'!='|'==' ;
逻辑运算:
'&&'|'||'
;
ArithOp:
'+'|'-'|'*'|'/'|'%';    
WS
:)(“”|’\t’|’\n’|’\r’+{skip();}
; 

首先,删除后面的分号(

因此,它必须是公正的:

tokens {
    ...
}
这就是为什么
AntlrWorks
说“无法显示规则'xxxxx',因为找不到启动状态”(我选中了这个)。
但是在这次更正之后,您可能会在语法中看到一些新的错误,这些错误实际上是存在的,但这已经是另一个问题了。

语法远非“正确”,我真的不相信AntlWorks在生成词法分析器和语法分析器时不会抱怨。在浏览你的语法时,我发现至少有4个错误。您使用的是什么版本的AntlWorks?这真的是你发布的语法,还是你发布了不同版本的语法?@BartKiers,事实上是的,这个语法包含很多错误。但是AntlrWorks“无法显示规则”x…“中的错误是由于分号而显示的,分号放在“tokens{…}”描述之后。这就是我的观点:语法不是“true”。。。你现在解决了吗?没有,直到现在我才发现我的语法错误。正如Andremonity所说,我省略了分号,但antlrworks没有显示错误。我使用的是AntlR3.5-rc-2和antlrworks 1.5
tokens {
    ...
}