[antlr-interest] COBOL
Greg Lindholm
glindholm at yahoo.com
Wed May 29 17:49:05 PDT 2002
--- Balvinder Singh wrote:
> AphabeticUserDefinedWord : (('0'.. '9')+ ('-')*)* ('0' .. '9')*
('A' ..
> 'Z' 'a' .. 'z') ('A' .. 'Z' 'a' .. 'z' '0' .. '9')* (('-')+ ('A' ..
'Z' 'a'
> .. 'z' '0' .. '9')+)*
> ;
Maybe this will help with COBOL user defined words.
What I did was factor them into 2 rules depending on if they start with
a letter or a digit.
// Identifier:
// Start with a digit or letter
// Middle can be digit, letter, or hyhen (or underscore)
// Must have at least one letter
// End with a digit or letter (*** NOT CHECKED ***)
//
// Acucobol:
// BINARY: 'B' '#' ('0'|'1')+
// OCTAL: ('O' '#' | '%') ('0'..'7')+
// HEX: ('H'|'X') '#' (HEXDIGIT)+
//
// Micro Focus:
// HEX: 'H' '"' ( HEXDIGIT)+ '"'
// HEX: 'X' '"' ( HEXDIGIT)+ '"' (Non-numeric literal)
// Identifiers and Hex/Oct/Bin Literals can start with a letter
START_WITH_LETTER
:
('b' '#') => 'b' '#' ('0'|'1')+
{ $setType(T_NUMERIC_LITERAL); }
|
('o' '#') => 'o' '#' ('0'..'7')+
{ $setType(T_NUMERIC_LITERAL); }
|
(('h'|'x') '#') => ('h'|'x') '#' (HEXDIGIT)+
{ $setType(T_NUMERIC_LITERAL); }
|
('h' '"') => 'h' '"' (HEXDIGIT)+ '"'
{ $setType(T_NUMERIC_LITERAL); }
|
('x' '"') => 'x' '"' (HEXDIGIT)+ '"'
{ $setType(T_HEX_LITERAL); }
|
LETTER (LETTER | DIGIT | HYPHEN)*
{ $setType(T_IDENTIFIER); }
;
// Identifiers and unsigned numbers can start with a digit
START_WITH_DIGIT
: (DIGIT (DIGIT | HYPHEN)* LETTER) =>
DIGIT (DIGIT | HYPHEN)* LETTER (LETTER | DIGIT | HYPHEN)*
{ $setType(T_IDENTIFIER); }
| (DIGITS '.' DIGITS) => DIGITS '.' DIGITS (EXPONENT)?
{ $setType(T_FLOAT); }
| (DIGITS '.' EXPONENT) => DIGITS '.' EXPONENT
{ $setType(T_FLOAT); }
| DIGITS
{ $setType(T_INT); }
;
Greg
__________________________________________________
Do You Yahoo!?
Yahoo! - Official partner of 2002 FIFA World Cup
http://fifaworldcup.yahoo.com
Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
More information about the antlr-interest
mailing list