Lexer太长时间不工作,总之可以很好地工作

时间:2019-05-30 18:32:03

标签: antlr4

我正在用西班牙语的伪代码在词法分析器中工作。问题是当程序遇到逻辑表达式不起作用时时间太长。测试工具无法识别逻辑表达式。

我尝试按照更小的规则进行重构,但是相同并且可以在短树中正常工作。

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的示例

什么时候长

enter image description here

简短示例(忽略错误,我忘了写那个)

enter image description here

0 个答案:

没有答案