输入不匹配的ANTLR4 java

时间:2015-10-20 00:24:20

标签: java input grammar antlr4

晚安!,id就像这个问题的一些帮助,我在java上构建西班牙语版C的语法

Grammar unalang;

//GRAMATICA
init: value? declare_variables* value? declare_function* value?
;

//REALIZACION DE COMENTARIOS
value: single_comments
| multicomment
;

single_comments: COMMENTS frase WS
;

multicomment: COMMENT_MULTI frase* COMMENT_MULTICLOSE WS
;


//DECLARACION VARIABLES GLOBALES
declare_variables: declare_entero 
| declare_vacio 
| declare_real 
| declare_cadena
;

declare_entero: ENTERO WS STRING (COMA WS STRING)* PYC value* WS
| ENTERO WS STRING IGUAL INT (COMA WS STRING IGUAL INT)* PYC value* WS
;

declare_vacio: VACIO WS STRING (COMA WS STRING)* PYC value* WS
;

declare_real: REAL WS STRING (COMA WS STRING)* PYC value* WS
| REAL WS STRING IGUAL INT (DOT INT)?  (COMA WS STRING IGUAL INT (DOT INT)?)* PYC value* WS
;

declare_cadena: CADENA WS STRING (COMA WS STRING)* PYC value* WS
| CADENA WS STRING IGUAL INT (COMA WS STRING IGUAL COMILLAS palabras* COMILLAS)* PYC value* WS
;

//DECLARACION FUNCIONES
declare_function: declare OPEN_PAR (declare_tipo)? CLOSE_PAR OPEN_LL contenido RETORNAR (STRING|(INT(DOT INT)?))? PYC WS CLOSE_LL
;

declare_tipo: ENTERO WS STRING (RAYA_PISO STRING)* (COMA WS declare_tipo)*
| VACIO WS STRING (RAYA_PISO STRING)* (COMA WS declare_tipo)*
| CADENA WS STRING (RAYA_PISO STRING)* (COMA WS declare_tipo)*
| REAL WS STRING (RAYA_PISO STRING)* (COMA WS declare_tipo)*
;

contenido: asignaciones* condicional*
| WS
|
;

asignaciones: STRING IGUAL INT WS
| STRING IGUAL COMILLAS frase COMILLAS WS
| STRING IGUAL INT (DOT INT)? WS
;



condicional: SI OPEN_PAR STRING comparador STRING CLOSE_PAR  ((YY|OO) OPEN_PAR STRING comparador STRING CLOSE_PAR)* ENTONCES OPEN_LL contenido CLOSE_LL
;

comparador: COMP_IGUAL
| MAYOR
| MENOR
| COMP_DIFERENTE
| COMP_MENOR
| COMP_MAYOR
;


declare: ENTERO WS STRING (RAYA_PISO STRING)*
| VACIO WS STRING (RAYA_PISO STRING)*
| CADENA WS STRING (RAYA_PISO STRING)*
| REAL WS STRING (RAYA_PISO STRING)*
;


frase: (palabras)* WS
;

palabras: STRING
| WS
;

// TOKENS
INT : [0-9]+ ; // Define token INT as one or more digits
STRING: ([a-z]|[A-Z])+ ; // Define token STRING as one or more letters(uppercase or lowercase)

//Comentarios
COMMENTS: '//' ;
COMMENT_MULTI: '/*' ;
COMMENT_MULTICLOSE: '*/' ;

//Operadores binarios
//Aritmeticos
SUMA: '+' ;
RESTA: '-' ;
MULTIPLICACION: '*' ;
DIVISION: '/' ;
RESIDUO: '%' ;

//Operador unario
NO: 'no' ;

//RELACIONALES
IGUAL: '=' ;
COMP_IGUAL: '==';
COMP_MENOR: '<=';
COMP_MAYOR: '>=';
COMP_DIFERENTE: '!=';
MENOR: '<';
MAYOR: '>';

//LOGICOs
YY: 'y' ;
OO: 'o' ;
ENTONCES: 'entonces' ;
RETORNAR: 'retornar' ;

//SIMBOLOS
OPEN_PAR: '(' ;
CLOSE_PAR: ')' ;
OPEN_LL: '{' ;
CLOSE_LL: '}' ;
PYC: ';' ;
COMA: ',' ;
DOT: '.' ;
RAYA_PISO: '_' ;
COMILLAS: '\'' ;

//PALABRAS
ENTERO: 'entero' ;
REAL: 'real' ;
CADENA: 'cadena' ;
VACIO: 'vacio' ;
RETURN: 'retorno' ;

//Condicionales
SI: 'si' ;
SINO: 'si_no' ;

//Ciclos
MIENTRAS: 'mientras' ;
HACER: 'hacer' ;

WS : [' '\t\r\n]+ -> skip ; // Define whitespace rule, toss it out ;

但是当我尝试使用输入测试用例时,我总是得到不匹配的输入错误:

第1行:0输入'entero'不匹配期待{,'//','/ *','entero','real','cadena','vacio'}

当我使用代码显示ANTLR的GUI树时,我得到一棵树看起来像这样:

ex2

当我需要它像这样显示时:

ex3

问题似乎是语法总是卡在init节点上,而且我对如何解决它没有任何想法。

这是我正在使用的输入代码:

// Ejemplo en UNALang
entero g = 9; // variable global
entero fact(entero x) { // funcion factorial
 si x==0 entonces {
retornar 1;
 }
 retornar x * fact(x-1);

0 个答案:

没有答案