ich meine eigene Grammatik schrieb:interner Fehler in ANTLR4 Grammatikregeln
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: [ \t\r\n]+ ->skip ;
habe ich diesen Fehler:
error(20): SimpleCode.g4:8:12: internal error: Rule int_literal undefined
Ich weiß nicht, warum dieser Fehler passiert ist. Das int_literal wurde definiert. Bitte erklären Sie mir, warum dieser Fehler passiert ist. Ich habe den Grund nicht herausgefunden.
Danke für Ihre Hilfe.
Nur der erste Buchstabe muss Großbuchstaben für eine Lexer-Regel sein, z. 'Digit' ist ein gültiger Lexer-Regelname. –
Wahr, aber während gültig eine Menge der geteilten Grammatiken scheinen in der Regel vollständig Blöcke zu sein, um es einfacher zu machen, sie auseinander zu teilen, aber gültiger Punkt :) – D3181
Vielen Dank. Ich habe vergessen, Lexer-Regeln und Parser-Regeln. Mein schlechtes überhaupt. – caoduylam