晚安!,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树时,我得到一棵树看起来像这样:
当我需要它像这样显示时:
问题似乎是语法总是卡在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);