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

编译器/解释器

开发平台:

Others

  1. options {
  2. language="Cpp";
  3. }
  4. {
  5. #include <iostream>
  6. }
  7. class Rewrite extends Lexer;
  8. //protected
  9. START
  10. options {
  11. ignore=WS_;
  12. }
  13. : id:ID ":="! '('! expr:EXPR ')'!
  14. {
  15. // can access text matched for any rule
  16. std::cout << "found " << id->getText() << "," << expr->getText() << std::endl;
  17. // text will be ID+EXPR minus whitespace
  18. }
  19. ;
  20. protected
  21. ID : ( let:LETTER {std::cout << "letter " << let->getText() << std::endl;} )+
  22. ;
  23. protected
  24. LETTER
  25. : 'a'..'z'
  26. {
  27. std::string s = $getText; // get access text of this rule
  28. // $setText(s.toUpperCase()); // can reset it too
  29. $setText(s); // can reset it too
  30. }
  31. ;
  32. protected
  33. EXPR: i:INT! // don't include, but i->getText() has access
  34. {$setText(i->getText());} // effect is if no "!" and no "i:"
  35. | ID
  36. ;
  37. protected
  38. INT : ('0'..'9')+
  39. ;
  40. // what if ! on rule itself and invoker had !...should
  41. // rule return anything in the token to the invoker?  NO!
  42. // make sure 'if' is in the right spot
  43. // What about no ! on caller but ! on called rule?
  44. protected
  45. WS_! : ( ' ' // whitespace not saved
  46. | 't'
  47. | 'n' {newline();}
  48. )+
  49. {$setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP);} // way to set token type
  50. ;