rewrite.g
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:1k
源码类别:

编译器/解释器

开发平台:

Others

  1. options {
  2. language = "Sather";
  3. }
  4. class REWRITE extends Lexer;
  5. {
  6.    println ( str : STR ) is 
  7.      #OUT + str + "n";
  8.    end;
  9. }
  10. protected
  11. START
  12. options {
  13. ignore=WS;
  14. }
  15. : id:ID ":="! '('! expr:EXPR ')'!
  16. {
  17. -- can access text matched for any rule
  18. println( "found " + id.text + "," + expr.text );
  19. -- text will be ID+EXPR minus whitespace
  20. }
  21. ;
  22. protected
  23. ID : ( let:LETTER { println( "letter "+let.text ); } )+
  24. ;
  25. protected
  26. LETTER
  27. : 'a'..'z'
  28.                 // note do !NOT! put spaces inside parens! (ActionLexer does not seem to handle it).
  29.                 {
  30. s : STR := %getText; -- get access text of this rule
  31. %setText(s.upper); -- can reset it too 
  32. }
  33. ;
  34. protected
  35. EXPR: i:INT! // don't include, but i.text has access
  36. {%setText(i.text);} // effect is if no "!" and no "i:"
  37. | ID
  38. ;
  39. protected
  40. INT : ('0'..'9')+
  41. ;
  42. // what if ! on rule itself and invoker had !...should
  43. // rule return anything in the token to the invoker?  NO!
  44. // make sure 'if' is in the right spot
  45. // What about no ! on caller but ! on called rule?
  46. protected
  47. WS! : ( ' ' // whitespace not saved
  48. | 't'
  49. | 'n' {newline;}
  50. )+
  51. {%setType(ANTLR_COMMON_TOKEN::SKIP);} // way to set token type
  52. ;