compiler construction - Scanner (Lexing keywords with ANTLR) -
I am working on writing a scanner for my program and a parser with most of the online tutorials included It is not possible to write a lixar without writing a parser at the same time. I'm just trying to generate tokens, they do not interpret them. I want to identify some tokens like INT tokens, float tokens and "start" and "end"
I'm confused about the keyword matching I tried the following attempts to fail:
  keyword: KEY1 | Key 2; KEY1: {input.LT (1) .gettext (). Equal ("BEGIN")}? Letter +; KEY2: {input.LT (1) .gettext (). Equal ("END")}? Letter +; FLOATLITERAL_INTLITERAL: DIGIT + ({2}! = '.}}} = & Gt;'. 'DIGIT * {$ type = FLOATLITERAL;} | {$ type = INTLITERAL;}). '.' DIGIT + {$ type = flotitual}; Piece letter: ('a' .. 'z' | 'a' .. 'z'); Piece points: ('0' .. '9'); Identifier: Letter | Letter digit (letter | digit) + | Letter (letter | DIGIT) *; WS // Whitespace: ('' '\ t' | '' \ n '|' \ r '|' '' f ') + {$ channel = HIDDEN;};     
  If you want only a laser, start your grammar like this :  
  laser grammar FooLexer; // makes: FooLexer.java     LT (int): token  can only be used on parser rules (A). Inside Lexter rules, you can only use  LA (int): int  which is next  int  but there is no need for further manual look. Just do something like this:    laser grammar FooLexer; BEGIN: 'BEGIN'; END: 'END'; Float: DIEGIT + '.' DIGIT +; INT: DIGIT +; Identifier: Letter (Letter / Figure) *; WS: ('' '\ t' | '' \ n '|' \ r '|' '\ f') + {$ channel = HIDDEN;}; Piece letter: ('a' .. 'z' | 'a' .. 'z'); Piece points: ('0' .. '9');    I do not need to create a token with the name  KEYWORD  that matches all keywords: You want to distinguish between  BEGIN  and  END  token, right? But if you really want it, then just do it:    keyword: 'BEGIN' | 'End' ; Remove the    and  BEGIN  and  END  rules. Just make sure that  KEYWORD  is defined before  IDENTIFIER .   EDIT  
 Test the laser with the following squares:  
  import org.antlr. Runtime *; Public square main {public static zero main (string [] args) Exception {String src = "BEGIN END 3.14159 42 FOO"] throws; FoLexer lexer = new FooLexer (new ANTLRStringStream (src)); While (true) {token token = lexer.nextToken (); If (token.getType () == FooLexer.EOF) {break; } System.out.println (token.getType () + "::" + token.getText ()); If you generate a lezzer, then compile the .java source files and run the main square like this:    Java-CP antiali3.3 .jar org.antlr.Tool FooLexer.g javac-cp Analyzer3.3.jar *. The following output will be printed in the Java Java-CP: Annealer-3.3.jpg main    console:    4 :: BEGIN 11 :: 5 :: end 11 :: 7 :: 3.1415 9 11 :: 8 :: 42 11 :: 10 :: FOO    
 
   
Comments
Post a Comment