我正在用西班牙语的伪代码在词法分析器中工作。问题是当程序遇到逻辑表达式不起作用时时间太长。测试工具无法识别逻辑表达式。
我尝试按照更小的规则进行重构,但是相同并且可以在短树中正常工作。
grammar tpi;
/*========
* Parser
=========*/
/* PROGRAMA GENERAL */
start : programa EOF;
programa : ACCION IDENTIFICADOR NEWLINE ambiente proceso FINACCION ;
ambiente : AMBIENTE NEWLINE lineaambiente? ;
lineaambiente : ( IDENTIFICADOR ':' TIPODEDATO NEWLINE lineaambiente? | IDENTIFICADOR '=' ( termino | TXT ) NEWLINE lineaambiente? );
proceso : PROCESO NEWLINE lineacod;
lineacod : (
asignacion NEWLINE+ lineacod?
| funcion NEWLINE+ lineacod?
| sentencias NEWLINE lineacod?
);
asignacion : IDENTIFICADOR ASIGNACION ( exprecionalgebraica | TXT ) ;
sentencias : (
MIENTRAS logica HACER NEWLINE lineacod FINMIENTRAS
| REPETIR NEWLINE lineacod HASTAQUE logica
| SI logica ENTONCES NEWLINE lineacod (SINO NEWLINE lineacod)? FINSI
| PARA asignacion HASTA termino ',' termino HACER NEWLINE lineacod FINPARA
| SEGUN IDENTIFICADOR HACER NEWLINE lineasegun DEFECTO NEWLINE lineacod FINSEGUN
);
lineasegun : (
termino ':' lineacod NEWLINE lineasegun
| termino ':' lineacod
) ;
funcion : (LEER PAR arg IPAR | ESCRIBIR PAR arg IPAR );
arg : (
TXT','arg
| IDENTIFICADOR ',' arg
| TXT
| IDENTIFICADOR
| numero
) ;
logica : (
| hojal OPREL hojal
| NOTL? PAR logica IPAR
| terminolog '_o' logica
| terminolog '_y' logica
);
terminolog : (
hojal OPREL hojal
| NOTL? hojal
| NOTL? PAR logica IPAR
);
hojal : (
numero
| ( NOTL | NOT )? IDENTIFICADOR
| NOTL? BOOL
| exprecionalgebraica
);
exprecionalgebraica : (
NOT? termino OP exprecionalgebraica
| NOT? termino
| PAR exprecionalgebraica IPAR
);
termino : (
numero
| NOT? IDENTIFICADOR
);
numero : (
| NOT? NUMEROENTERO','NUMEROENTERO
| NOT? NUMEROENTERO
);
/*=========
* Lexer
=========*/
ACCION :'accion_es';
FINACCION :'fin_accion';
AMBIENTE : 'ambiente';
PROCESO : 'proceso';
TIPODEDATO : ( 'cadena' | 'entero' | 'decimal');
PRUEBA : 'hola';
MIENTRAS : 'mientras';
HACER : 'hacer:';
FINMIENTRAS : 'fin_mientras';
HASTAQUE : 'hasta_que';
REPETIR : 'repetir';
SI : 'si';
ENTONCES : 'entonces:';
SINO : 'sino';
FINSI : 'fin_si';
PARA : 'para';
HASTA : 'hasta';
FINPARA : 'fin_para';
SEGUN : 'segun';
DEFECTO : 'defecto:';
FINSEGUN : 'fin_segun';
ESCRIBIR : 'escribir';
LEER : 'leer';
OPREL : ('>' | '<' | '=' | '>=' | '<=' | '<>');
NOTL : '_no' ;
PAR : '(' ;
IPAR : ')' ;
NOT : '-' ;
COMA : ( '.' | ',' );
OP : ( '+' | '-' | '**' | '*' | '/' | '_mod' | '_div');
NUMEROENTERO : [0-9]+ ;
ASIGNACION : (':=' | '-:=' | '+:= ');
BOOL : ( 'TRUE' | 'FALSE' );
IDENTIFICADOR : [a-z][a-zA-Z0-9]*('_'[a-zA-Z0-9]+)*;
TXT : '"' (~["])+ '"' ; /* posiblemente \"(.*?)\" */
WHITESPACE : (' ' | '\t')+ -> skip ;
NEWLINE : ('\r'? '\n' | '\r')+ ;
example的示例
什么时候长
简短示例(忽略错误,我忘了写那个)