Antlr工作语法图不生成尽管有真正的语法

时间:2012-12-24 17:45:55

标签: compiler-construction antlr antlrworks

我正在努力使编译器像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();}
    ; 

1 个答案:

答案 0 :(得分:0)

首先,在

之后删除分号(;
tokens {
    ...
} *;*

所以,它必须只是:

tokens {
    ...
}

这是AntlrWorks为什么“无法显示规则'xxxxx'因为找不到启动状态”的主要原因(我检查了这个)。 但是在这次修正后你可能会看到你的语法中出现了几个新的错误,这些错误实际存在,但这已经是另一个问题了。