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