[antlr-interest] Relational operator in COBOL
Jose Ventura
jose.ventura.roda at gmail.com
Fri Mar 3 06:51:26 PST 2006
Hi, all
I'm trying to write a cobol lex and I have a problem with the relational
operator.
In cobol the operator NOT is a unary operator, but if they is following of
the '=' operator, is the NotEqual operator. There isn't a expecific operator
for NotEqual like java ("!=").
I don't know to resolve this problem in the parser, I have to much
ambiguities.
Any know how can I detect "NOT =" OR "NOT EQUAL" ?
Thanks a lot,
class CobolLex extends Lexer;
options
{
k=2;
charVocabulary = '\3'..'\377'; // Unicodes usuales
caseSensitive=false;
caseSensitiveLiterals=false;
testLiterals=false;
exportVocab=CobolLexVocab;
}
tokens
{
FIN_TODO;
NUM;
IDENT;
LIT_HEXADECIMAL;
LIT_PIC;
LIT_COPY;
FECHA;
IGUAL;
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;
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
{
result = super.makeToken(type);
if (type==SQL||type==CICS)
{
enExec = true;
}
}
ultPic =(type==PIC||type==PICTURE);
// ... añadimos información del nombre de fichero
result.setFilename(super.getFilename());
// ... y devolvemos el token
return (result);
}
}
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 }?
','
(
(DIGITO)+ {_ttype=NUM;}
)?
;
POR
: {!ultPic }? '*'
;
DIVIDE
: '/'
;
MAYOR: '>';
MENOR: '<';
MAYOR_IGUAL: ">=";
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)+ (',' (DIGITO)+)?
{$setType (NUM);}
| '_' (LETRA|DIGITO|'_')*
{$setType (IDENT);}
;
CADENA :
'\''! ( ~('\''|'\n'|'\r'|'\t') )* '\''!
| '"'! ( ~('"'|'\n'|'\r'|'\t') )* '"'!
;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20060303/206304dc/attachment-0001.html
More information about the antlr-interest
mailing list