Fwd: [antlr-interest] Relational operator in COBOL

Jose Ventura jose.ventura.roda at gmail.com
Wed Mar 8 07:13:13 PST 2006


Skipped content of type multipart/alternative-------------- next part --------------
A non-text attachment was scrubbed...
Name: mcon.java
Type: application/octet-stream
Size: 1268 bytes
Desc: not available
Url : http://www.antlr.org/pipermail/antlr-interest/attachments/20060308/e385920e/mcon-0001.obj
-------------- next part --------------
@condition 1
ident1 > 1 .

@condition 2
ident1 = 1 or (ident2 GREATER 2). 

@condition 3
ident1 > 0 and ident1 < 50 .

@condition 4
ident1 NOT = 0 .

@condition 5, is like condition 3 
ident1 > 0 and < 50.

@condition 6
ident1 (1, hola, 3+5)(1:5) = "Test l".


















-------------- next part --------------
/*header 
{
	package cobol;
}
	*/
class CobolLex extends Lexer;
options 
{ 
	k=1;
	charVocabulary = '\3'..'\377'; // Unicodes usuales
	caseSensitive=false;
	caseSensitiveLiterals=false;
	testLiterals=false;
	exportVocab=CobolLexVocab;

} 
tokens										// MUST be kept in sync with "keywordsTable" Hashtable below!!
{
	FIN_TODO;
	NUM;
    IDENT;
	LIT_HEXADECIMAL;
	LIT_PIC;
	LIT_COPY;
	FECHA;
	IGUAL;
	MAYOR_IGUAL;
	MENOR_IGUAL;
	NOT_REL;
    
    IDENTIFICATION="IDENTIFICATION";
	ID="ID";
	ENVIRONMENT="ENVIRONMENT";
	DATA="DATA";
	WORKING="WORKING-STORAGE";
	LINKAGE="LINKAGE";
	DIVISION="DIVISION";
	PROGRAM_ID="PROGRAM-ID";
	PROCEDURE="PROCEDURE";
	SECTION="SECTION";

	ACCEPT="ACCEPT";
	ADD="ADD";
	ALL="ALL";
	ALSO="ALSO";
	ALTER="ALTER";
	AND="AND";
	AT="AT";
	BLANK="BLANK";
	BY="BY";
	CALL="CALL";
	CANCEL="CANCEL";
	CICS="CICS";
	CLOSE="CLOSE";
	COMPUTE="COMPUTE";
	COMMAREA="COMMAREA";
	COMMIT="COMMIT";
	CONTINUE="CONTINUE";
	CORR="CORR";
	CORRESPONDING="CORRESPONDING";
	DELETE="DELETE";
	DELIMITED="DELIMITED";
	DISPLAY="DISPLAY";
	DIVIDE="DIVIDE";
	ELSE="ELSE";
	END="END";
	END_ADD="END-ADD";
	END_CALL="END-CALL";
	END_COMPUTE="END-COMPUTE";
	END_DIVIDE="END-DIVIDE";
	END_EVALUATE="END-EVALUATE";
	END_EXEC="END-EXEC";
	END_IF="END-IF";
	END_MULTIPLY="END-MULTIPLY";
	END_PERFORM="END-PERFORM";
	END_SEARCH="END-SEARCH";
	END_STRING="END-STRING";
	END_UNSTRING="END-UNSTRING";
	END_SUBTRACT="END-SUBTRACT";
	ENTRY="ENTRY";
	EVALUATE="EVALUATE";
	EXEC="EXEC";
	EXIT="EXIT";
	METHOD="METHOD";
	PROGRAM="PROGRAM";
	GOBACK="GOBACK";
	GO_TO="GO TO";
	IF="IF";
	IN="IN";
	INITIALIZE="INITIALIZE";
	INSPECT="INSPECT";
	INTO="INTO";
	INVOKE="INVOKE";
	LINK="LINK";
	MERGE="MERGE";
	MOVE="MOVE";
	MULTIPLY="MULTIPLY";
	OF="OF";
	OPEN="OPEN";
	OR="OR";
	OTHER="OTHER";
	PERFORM="PERFORM";
	POINTER="POINTER";
	READ="READ";
	RECEIVE="RECEIVE";
	REDEFINES="REDEFINES";
	RELEASE="RELEASE";
	REPLACING="REPLACING";
	TALLYING="TALLYING";
	RETURN="RETURN";
	REWRITE="REWRITE";
	ROLLBACK="ROLLBACK";
	SEARCH="SEARCH";
	SEND="SEND";
	SET="SET";
	SQL="SQL";
	SORT="SORT";
	SPACE="SPACE";
	SPACES="SPACES";
	START="START";
	STOP="STOP";
	STRING="STRING";
	SUBTRACT="SUBTRACT";
	SYNCPOINT="SYNCPOINT";
	TO="TO";
	THEN="THEN";
	UNSTRING="UNSTRING";
	WRITE="WRITE";
	ZERO="ZERO";
	ZEROS="ZEROS";
	ZEROES="ZEROES";
	THROUGH="THROUGH";
	THRU="THRU";
	VARYING="VARYING";
	UNTIL="UNTIL";
	USING="USING";
	WHEN="WHEN";
	WITH="WITH";
	TEST="TEST";
	BEFORE="BEFORE";
	AFTER="AFTER";
	JUSTIFIED="JUSTIFIED";
	JUST="JUST";
	OCCURS="OCCURS";
	ASCENDING="ASCENDING";
	DESCENDING="DESCENDING";
	KEY="KEY";
	IS="IS";
	INDEXED="INDEXED";
	PIC="PIC";
	PICTURE="PICTURE";
	USAGE="USAGE";
	VALUE="VALUE";
	VALUES="VALUES";
	ARE="ARE";
	RENAMES="RENAMES";
	COPY="COPY";
	BINARY="BINARY";
	COMP="COMP";
	COMP1="COMP-1";
	COMP2="COMP-2";
	COMP3="COMP-3";
	COMP4="COMP-4";
	COMPUTATIONAL="COMPUTATIONAL";
	COMPUTATIONAL1="COMPUTATIONAL-1";
	COMPUTATIONAL2="COMPUTATIONAL-2";
	COMPUTATIONAL3="COMPUTATIONAL-3";
	COMPUTATIONAL4="COMPUTATIONAL-4";
	DISPLAY1="DISPLAY-1";
	INDEX="INDEX";
	PACKED_DECIMAL="PACKED-DECIMAL";
	CHARACTERS="CHARACTERS";
	LEADING="LEADING";
	FIRST="FIRST";
	INITIAL="INITIAL";
	CONVERTING="CONVERTING";
	FOR="FOR";
	UP="UP";
	DOWN="DOWN";
	NOT="NOT";
	NULL="NULL";
	ON="ON";
	SIZE="SIZE";
	ERROR="ERROR";
	THAN="THAN";
	GREATER="GREATER";
	LESS="LESS";
	EQUAL="EQUAL";
	NUMERIC="NUMERIC";
	ALPHABETIC="ALPHABETIC";
	POSITIVE="POSITIVE";
	NEGATIVE="NEGATIVE";
	FROM="FROM";
	

}

{ // Comienza la zona de código nativo

boolean ultPic=false;
boolean enExec=false;
protected Token makeToken(int type)
{
	// Usamos la implementación de la superclase...
	Token result = null;

	
// while I don't have a parser for CICS and SQL.

	if (enExec)
	{
		if (type==END_EXEC||
			type==RETURN ||
			type==RECEIVE ||
			type==SEND   ||
			type==SYNCPOINT ||
			type==LINK
			)
		{
			enExec=false;
			result = super.makeToken(type);
		}
		else
		{
			result = super.makeToken(IDENT);
		}
	}
	else
	{
		if (type==NOT)
		{
			if (esOperadorRelacional())
			{
				type=NOT_REL;
				System.out.println ("Se cambia a NOT");
			}
		}
		result = super.makeToken(type);
	}

	enExec=(type==SQL||type==CICS);
	ultPic =(type==PIC||type==PICTURE);
	
	
		
	// ... añadimos información del nombre de fichero
	result.setFilename(super.getFilename());
	// ... y devolvemos el token
	return (result);
	
}

protected boolean esOperadorRelacional ()
{
	boolean operadorRelacional = false;
	int marca = mark();
	try
	{
		while ( LA(1)==' ')
		{
			try
			{
				match(' ');
			}
			catch (MismatchedCharException m)
			{
				System.out.println ("Error en el match del NOT. "+m.getMessage());
			}
		}
		switch (LA(1))
		{
			case '=':
				operadorRelacional = true;
				break;
			case '>':
				operadorRelacional = true;
				break;
			case '<':
				operadorRelacional = true;
				break;
			case 'g':
				operadorRelacional = true;
				try
				{
					match("greater");
				}
				catch (MismatchedCharException m)
				{
					operadorRelacional = false;
				}
				break;
			case 'l':
				operadorRelacional = true;
				try
				{
					match("less");
				}
				catch (MismatchedCharException m)
				{
					operadorRelacional = false;
				}
				break;
			case 'e':
				operadorRelacional = true;
				try
				{
					match("equal");
				}
				catch (MismatchedCharException m)
				{
					operadorRelacional = false;
				}
				break;
		}
	}
	catch (CharStreamException c)
	{
		System.out.println ("problemas al leer despues del NOT");
	}
	rewind (marca);
	return (operadorRelacional);

}

}
COMENTARIO:
	'@' ( ~('\n'|'\r') )* 
	{$setType(Token.SKIP);}
	;

PAR_AB
	: {!ultPic }? '('
	;
PAR_CE
	: {!ultPic }? ')'
	;
CAD_COPY
	: ("==") => "==" ( ~('=') )*	"=="
	{ $setType(LIT_COPY); }
	| '='
	{ $setType(IGUAL); }
	;
DOSPUNTOS
	: ':'
	;

MAS
	: {!ultPic }? 
	  '+' {_ttype = MAS;}
	  (
	  		(DIGITO)+ (',' (DIGITO)+)? 
			{_ttype = NUM;}
	   )?
	;
	
MENOS
	: {!ultPic }?
	  '-' {_ttype = MENOS;}
	  (
	  		(DIGITO)+ (',' (DIGITO)+)? 
			{_ttype = NUM;}
	   )?
	;
	
PUNTO
	: {!ultPic }?
	  '.' {_ttype = FIN_TODO;}
	  (
	  	(DIGITO)+ {_ttype=NUM;}
	   )?
	 ;
COMA
	: {!ultPic }?
	  ',' {_ttype=COMA;} 
	  (
	  	(DIGITO)+ {_ttype=NUM;}
	   )?
	 ;
	 
POR
	: {!ultPic }? '*'
	;

DIVIDE
	: '/'
	;

MAYOR
	: '>'
		('=' {_ttype=MAYOR_IGUAL;})?
	;
MENOR: '<'
		('=' {_ttype=MENOR_IGUAL;})?
	;

protected
LETRA
	: 'a'..'z'
	;

protected
DIGITO
	: '0'..'9'
	;


protected 
NL :
		(
		 ("\r\n") => "\r\n" // MS-DOS
		 | '\r' // MACINTOSH
		 | '\n' // UNIX
		 )
		 {newline(); }
		 ;

BLANCO :
		( ' '
		| '\t'
		| NL
		) 
		{ $setType(Token.SKIP); } // La acción del blanco: ignorar
		;

IDENT_NUM  options {testLiterals=true;}
	:{ ultPic }? ('+'|'-'|'$'|'b'|','|'e'|('0'..'9')|'x'|'s'|'v'|'z'|'*'|'('|')'|
	               {LA(2)!=' '&&LA(2)!='\n'&&LA(2)!='\r'}? '.')+  
	 {$setType (LIT_PIC);}
	|('x' '\'') => 'x' '\''( ~('\''|'\n'|'\r'|'\t') )*	'\'' 
	 {$setType (LIT_HEXADECIMAL);}
	| LETRA (LETRA|DIGITO|'-'|'_')*
	 {$setType (IDENT);}
	|((DIGITO)+ (LETRA|'-'|'_')) =>(DIGITO)+ (LETRA|'-'|'_') (LETRA|DIGITO|'-'|'_')*
	 {$setType (IDENT);}
	|((DIGITO)+ '/' )=> (DIGITO)+ '/' (DIGITO|'/')+
	 {$setType (FECHA);}
	| (DIGITO)+  ({LA(2)!=' '&&LA(2)!='\n'&&LA(2)!='\r'}? ',' (DIGITO)+)?
	 {$setType (NUM);}
	| '_' (LETRA|DIGITO|'_')*
	 {$setType (IDENT);}
	;

CADENA :
	'\''! 
	( ~('\''|'\n'|'\r'|'\t') )*
	'\''!
	| '"'! ( ~('"'|'\n'|'\r'|'\t') )* '"'!
	;


















-------------- next part --------------
class condition extends Parser; // Se extiende Parser, y no Lexer
options {
	buildAST = true;
	importVocab = CobolLexVocab;
}

tokens
{
	CONDICION;
	FIELD;
	LIST;
	MOD_TEXTO;
	INDICE;
}

setCondition
	: (condition FIN_TODO!)*
	{#setCondition = #( #[SET, "SET"] ,setCondition);}
	;


condition
	: conditionOR
	{#condition = #( #[CONDICION, "CONDICION"] ,#condition);}
	;
	
conditionOR
	: conditionAND (OR^ conditionAND)*
	;

conditionAND
	: expresionRelacional (AND^ expresionRelacional)*
	;
expresionRelacional
	: (expresionSuma)? (operador_relacional expresionSuma)*
	;
	

	
expresionSuma
	: expresionPor ( (MAS^|MENOS^) expresionPor)*
	;

expresionPor
	: expresionUnitaria ( (POR^|DIVIDE^) expresionUnitaria)*
	;
	
expresionUnitaria
	: MENOS^ expresionUnitaria
	| MAS^ expresionUnitaria
	| expresionUnitariaNoMasMenos
	;
expresionUnitariaNoMasMenos
	: (IS)? NOT^ expresionUnitaria
	| expresionPrimaria
	;
	
expresionPrimaria
	: identifier
	| literal
	| POSITIVE
	| NEGATIVE
	| NUMERIC
	| ALPHABETIC
	| PAR_AB! condition PAR_CE!
	;

operador_relacional
	:(NOT_REL)? 
	(GREATER (THAN)? (OR EQUAL (TO)?)?
	|MAYOR_IGUAL
	|MAYOR
	|LESS (THAN)? (OR EQUAL (TO)?)?
	|MENOR_IGUAL
	|MENOR
	|EQUAL (TO)?
	|IGUAL
	)
	;

	literal
	: NUM
	| CADENA
	| cero
	| SPACE
	| SPACES
	| LIT_HEXADECIMAL
	| NULL
	;
cero
	: ZERO
	| ZEROS
	| ZEROES
	;
	

identifier
	{String texto="";String i="";}
	: i=in_of {texto=i;}
	 (modif_campo)*
	{
		## = #( #[FIELD,texto] ,##);
	}
	;

in_of returns [String t]
	{t="";}
	: i1:IDENT {t+=#i1.getText();}
	  ( ( in1:IN {t+=" "+#in1.getText();}
	      |of1:OF {t+=" "+#of1.getText();}
		 )
		 i2:IDENT {t+=" "+#i2.getText();}
	  )*
	;
	
modif_campo 
	: (PAR_AB expresionSuma DOSPUNTOS) => PAR_AB! expresionSuma DOSPUNTOS (expresionSuma)? PAR_CE!
	{#modif_campo= #( #[MOD_TEXTO,"MOD_TEXTO"],#modif_campo);}
	| PAR_AB! conditionList  PAR_CE!
	{#modif_campo= #( #[INDICE,"INDICE"],#modif_campo);}
	;


conditionList
	: condition (COMA condition)*
	{#conditionList = #( #[LIST, "LIST"] ,conditionList);}
	;


















More information about the antlr-interest mailing list