[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