Запрос по грамматике ANTLR - PullRequest
       3

Запрос по грамматике ANTLR

0 голосов
/ 09 февраля 2019

Я создаю грамматику 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
    ;

Я не уверен, каквыразить эту часть 'READ ID |НАПИСАТЬ expr '.Когда я пытаюсь скомпилировать, выдает следующее сообщение об ошибке -

предупреждение (105): Calculator.g: 29: 19: нет правила лексера, соответствующего токену: WRITE предупреждение (105): Calculator.g: 28: 19: нет правила лексера, соответствующего токену: READ

Я новичок в ANTLR. Пожалуйста, поделитесь своими мыслями.

1 Ответ

0 голосов
/ 10 февраля 2019

READ и WRITE, вероятно, являются ключевыми словами, поэтому вы должны определить их и в своей грамматике (как вы сделали для ID):

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

и

LITERAL: (LETTER | DIGIT)+;

в качестве примера для LITERAL spec.

...