查询ANTLR语法

时间:2019-02-09 19:08:19

标签: antlr

我正在为下面的计算器程序创建ANTLR语法。

1   program       ->  stmt_list $$
2   stmt_list     ->  stmt_list stmt | E
3   stmt          ->  ID := expr | READ ID | WRITE expr
4   expr          ->  term | expr add_op term
5   term          ->  factor | term mult_op factor
6   factor        ->  ( expr ) | ID | LITERAL
7   add_op        ->  + | -
8   mult_op       ->  * | /

但是我在创建ANTLR语法版本时遇到了麻烦。我在下面写道-

grammar Calculator;
// Lexer specification

fragment LETTER 
    :   'a'..'z' | 'A'..'Z';
fragment DIGIT  
    :   '0'..'9';
ID  :   LETTER (LETTER | DIGIT)*;
NUM :   DIGIT+;
ADD :   '+';
SUB :   '-';
MUL :   '*';
DIV :   '/';
LPAR    :   '(';
RPAR    :   ')';
ASSIGN  :   '=';
NEWLINE :   '\r'?'\n';
WS  :   (' ' | '\t' | '\n' | '\r')+ { skip(); };

// Parser specification

program :   stmt_list NEWLINE* EOF;

stmt_list
    :   stmt
    ;
stmt    :   ID ASSIGN expr
                | READ ID
                | WRITE expr
    ;

expr    :       term (ADD term | SUB term)*
    ; 
term    :       factor (MUL factor | DIV factor)*
        ;
factor  :       LPAR expr RPAR
        |   ID
        |   NUM
    ;

我不确定如何表达“阅读ID |写expr'。当我尝试编译时,出现以下错误-

warning(105):Calculator.g:29:19:没有与标记对应的词法分析器规则:WRITE 警告(105):计算器。g:28:19:没有与令牌对应的词法分析器规则:READ

我是ANTLR的新手,请分享您的想法。

1 个答案:

答案 0 :(得分:1)

READWRITE可能是关键字,因此您也必须在语法中对其进行定义(就像您对ID所做的那样):

READ: 'READ';
WRITE: 'WRITE';

LITERAL: (LETTER | DIGIT)+;

作为LITERAL规范的示例。