ANTLR4语法规则内部错误



我自己写了语法:

grammar SimpleCode;
program: 'class Program' '{' field_decl* method_decl* '}' ;
field_decl: type id_int_list ;
id_int: id
      | id '[' int_literal ']'
      ;
id_int_list: id_int
           | id_int (',' id_int)*
           ;
method_decl: (type | 'void') id id_type_list? block ;
id_type_list: (type id)
            | (type id) (','(type id))*
            ;
block: '{' var_decl* statement* '}' ;
var_decl: type id_list ;
id_list: id
       | id (',' id)*
       ;
type: 'int'
    | 'boolean'
    ;
statement: location assign_op expr ';'
         | method_call ';'
         | 'if' expr block 'else' block
         | 'for' id '=' expr ',' expr block
         | 'return' expr? ';'
         | 'break' ';'
         | 'continue' ';'
         | block
         ;
assign_op: '='
         | '+='
         | '-='
         ;
method_call: method_name expr_list?
           | 'callout' (string_literal (',' callout_arg_list)?)
           ;
expr_list: expr
         | expr (',' expr)*
         ;
callout_arg_list: callout_arg
                | callout_arg (',' callout_arg)*
                ;
method_name: id ;
location: id
        | id '[' expr ']'
        ;
expr: location
    | method_call
    | literal
    | expr bin_op expr
    | '-' expr
    | '!' expr
    | '(' expr ')'
    ;
callout_arg: expr
           | string_literal
           ;
bin_op: arith_op
      | rel_op
      | eq_op
      | cond_op
      ;
arith_op: '+'
        | '-'
        | '*'
        | '\'
        | '%'
        ;
rel_op: '>'
      | '<'
      | '>='
      | '<='
      ;
eq_op: '=='
     | '!='
     ;
cond_op: '&&'
       | '||'
       ;
literal: int_literal
       | char_literal
       | bool_literal
       ;
id: alpha alpha_num* ;
alpha_num: alpha
         | digit
         ;
alpha: ( 'a'..'z' | 'A'..'Z' ) ;
digit: '0'..'9' ;
hex_digit: digit
         | 'a'..'f'
         | 'A'..'F'
         ;
int_literal: decimal_literal
           | hex_literal
           ;
decimal_literal: digit digit* ;
hex_literal: '0x' hex_digit hex_digit* ;
bool_literal: 'true'
            | 'false'
            ;
char_literal: ''' char ''' ;

string_literal: '"' char* '"' ;
WS: [ trn]+ ->skip ;

我得到这个错误:

error(20): SimpleCode.g4:8:12: internal error: Rule int_literal undefined

我不知道为什么会发生这个错误。定义了int_literal。请给我解释一下为什么会出现这个错误。我不知道原因。

我检查了您的代码,主要问题是您没有将Parser规则与Lexer规则分开。这是使用大写/大小写敏感来完成的。Lexer规则用大写字母定义。一旦这被纠正,你的语法也有一个错误,规则"char"是未定义的。

以下是修改后的版本:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
grammar SimpleCode;

program: 'class Program' '{' field_decl* method_decl* '}' ;
field_decl: type id_int_list ;
id_int: id
      | id '[' int_literal ']'
      ;
id_int_list: id_int
           | id_int (',' id_int)*
           ;
method_decl: (type | 'void') id id_type_list? block ;
id_type_list: (type id)
            | (type id) (','(type id))*
            ;
block: '{' var_decl* statement* '}' ;
var_decl: type id_list ;
id_list: id
       | id (',' id)*
       ;
type: 'int'
    | 'boolean'
    ;
statement: location assign_op expr ';'
         | method_call ';'
         | 'if' expr block 'else' block
         | 'for' id '=' expr ',' expr block
         | 'return' expr? ';'
         | 'break' ';'
         | 'continue' ';'
         | block
         ;
assign_op: '='
         | '+='
         | '-='
         ;
method_call: method_name expr_list?
           | 'callout' (string_literal (',' callout_arg_list)?)
           ;
expr_list: expr
         | expr (',' expr)*
         ;
callout_arg_list: callout_arg
                | callout_arg (',' callout_arg)*
                ;
method_name: id ;
location: id
        | id '[' expr ']'
        ;
expr: location
    | method_call
    | literal
    | expr bin_op expr
    | '-' expr
    | '!' expr
    | '(' expr ')'
    ;
callout_arg: expr
           | string_literal
           ;
bin_op: arith_op
      | rel_op
      | eq_op
      | cond_op
      ;
arith_op: '+'
        | '-'
        | '*'
        | '\'
        | '%'
        ;
rel_op: '>'
      | '<'
      | '>='
      | '<='
      ;
eq_op: '=='
     | '!='
     ;
cond_op: '&&'
       | '||'
       ;
literal: int_literal
       | char_literal
       | bool_literal
       ;
id: ALPHA alpha_num* ;
alpha_num: ALPHA
         | DIGIT
         ;
ALPHA: ( 'a'..'z' | 'A'..'Z' ) ;
DIGIT: '0'..'9' ;
HEX_DIGIT: DIGIT
         | 'a'..'f'
         | 'A'..'F'
         ;
int_literal: decimal_literal
           | hex_literal
           ;
decimal_literal: DIGIT DIGIT* ;
hex_literal: '0x' HEX_DIGIT HEX_DIGIT* ;
bool_literal: 'true'
            | 'false'
            ;
char_literal: ''' ALPHA ''' ;

string_literal: '"' ALPHA* '"' ;
WS: [ trn]+ ->skip ;

词法分析器规则用于创建令牌流,解析器用于语义,因此在组合语法中区分哪些规则是重要的。

在这个论坛上有一个很好的帖子,其中有相当详细的区别以及为什么需要它。但是除了缺少规则和缺少词法定义之外,一切都很好。只要记住INT: DIGIT+;

祝你项目顺利!

相关内容

  • 没有找到相关文章

最新更新