【问题标题】:Antlr works Syntax diagram not generated despite Of true grammar尽管语法正确,但 Antlr 工作语法图未生成
【发布时间】: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


【解决方案1】:

首先,去掉分号(;

tokens {
    ...
} *;*

所以,它一定是:

tokens {
    ...
}

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

【讨论】:

    猜你喜欢
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2017-05-25
    • 2013-04-23
    • 1970-01-01
    相关资源
    最近更新 更多