[antlr-interest] Question on recognizing a pattern

byeung128 byeung at etrade.ca
Wed Jun 12 10:51:23 PDT 2002


I am just a beginner on Antlr and I really think it is a gift for any 
developers. After reading some examples, I am trying to write a 
parser to recognize a address pattern like "NUMBER STREETNAME 
STREETTYPE DIRECTION". When I compiled the following source, I got 
error messages like "Lexical rule STREETYPE defined outside of 
lexer...". However, I declare all these rules inside the parser 
section not lexer section. Could you tell me what goes wrong ? Could 
you give me some advice on this grammar ? Thanks in advance.

class MyParser extends Parser;
{
  int i_count = 0 ;
}

startRule: a:address
   { System.out.println ( "->>>>>ADDRESS:" + a.getText() ); };


address : NUMBER STREETNAME STREETTYPE DIRECTION   ;

STREETTYPE:  AVENUE 
          |  STREET
          ;

AVENUE: "AVENUE" 
      | "AVENUE."
      | "AV"
      | "AV."
      | "AVE"
      | "AVE."
      ;

STREET: "STREET"
      | "STR"
      | "STR."
      | "ST."
      | "ST"
      ;

DIRECTION: EAST
         | WEST
         | SOUTH
         | NORTH
         | NORTHWEST
         | SOUTHWEST
         | NORTHEAST
         | SOUTHEAST
         ;

EAST: "EAST"
    | "E."
    | "E"
    ;

WEST: "WEST"
    | "W."
    | "W"
    ;

NORTH: "NORTH"
     | "N."
     | "N"
     ;

SOUTH: "SOUTH"
     | "S."
     | "S"
     ;
     
NORTHWEST: "NORTHWEST"
         | "NW."
         | "NW"
         ;

NORTHEAST: "NORTHEAST"
         | "NE."
         | "NE"
         ;

SOUTHWEST: "SOUTHWEST"
         | "SW."
         | "SW"
         ;
   
SOUTHEAST: "SOUTHEAST"
         | "SE."
         | "SE"
         ;

class MyLexer extends Lexer;
options {
  charVocabulary = '\3'..'\377' ;
  testLiterals=false ;
  k = 2 ;
}

{
  int i_STREETNAMECount = 0;
  int i_DICount = 0;
  int i_WSCount = 0;
}

WS : ( ' ' | '\t' | '\n' | '\r' ) 
     { $setType(Token.SKIP) ; 
       System.out.println ( "WS:" + (++i_WSCount) );  } ;

STREETNAME  
  options { testLiterals = true ; } 
: ( 'a'..'z' | 'A'..'Z' )+ 
  { System.out.println ( "CSTREETNAME:" + $getText ) ; 
    System.out.println ( "STREETNAME:" + (++i_STREETNAMECount) ); } ;

NUMBER: ( '0'..'9' )+ 
     { System.out.println ( "CNUMBER:" + $getText ) ; 
       System.out.println ( "NUMBER:" + (++i_DICount) ); } ;


 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 



More information about the antlr-interest mailing list