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

编译器/解释器

开发平台:

Others

  1. options {
  2. language = "Sather";
  3. }
  4. class P_PARSER extends Parser;
  5. {
  6. println( s : STR ) is
  7. OUT::create + s + 'n';
  8. end;
  9. }
  10. startRule
  11. : ( decl )+
  12. ;
  13. decl: INT a:ID { println("decl " + a.text ); }
  14. ( COMMA b:ID { println("decl " + b.text ); } )*
  15. SEMI
  16. ;
  17. class P_LEXER extends Lexer;
  18. options {
  19. charVocabulary = '3'..'377';
  20. k=2;
  21. }
  22. tokens {
  23. INT="int";
  24. }
  25. {
  26. upon_eof is
  27. if ( ~SYS::is_eq( M::selector.current_stream, M::main_lexer ) ) then
  28. -- // don't allow EOF until main lexer.  Force the
  29. -- // selector to retry for another token.
  30. M::selector.pop; -- // return to old lexer/stream
  31. M::selector.retry;
  32. else 
  33. OUT::create + "Hit EOF of main filen";
  34. end;
  35. end;
  36. }
  37. SEMI: ';'
  38. ;
  39. COMMA
  40. : ','
  41. ;
  42. ID
  43. : ('a'..'z')+
  44. ;
  45. INCLUDE
  46. : "#include" (WS)? f:STRING
  47. {
  48. -- // create lexer to handle include
  49. name : STR := f.text;
  50.                 input ::= IFSTREAM::open_for_read( name );
  51.                 if ( void(input) ) then
  52.             raise "cannot find file " + name;
  53.                 end;
  54. sublexer ::= P_LEXER{TOKEN}::create(input);
  55. -- // make sure errors are reported in right file
  56. sublexer.file_name(name);
  57. M::parser.file_name(name);
  58. -- // you can't just call nextToken of sublexer
  59. -- // because you need a stream of tokens to
  60. -- // head to the parser.  The only way is
  61. -- // to blast out of this lexer and reenter
  62. -- // the nextToken of the sublexer instance
  63. -- // of this class.
  64.                 M::selector.push(sublexer);
  65. -- // ignore this as whitespace; ask selector to try
  66. -- // to get another token.  It will call nextToken()
  67. -- // of the new instance of this lexer.
  68. M::selector.retry; -- // throws TokenStreamRetryException
  69. }
  70. ;
  71. STRING
  72. : '"'! ( ~'"' )* '"'!
  73. ;
  74. WS : ( ' '
  75. | 't'
  76. | 'f'
  77. // handle newlines
  78. | ( options {generateAmbigWarnings=false;}
  79. : "rn"  // Evil DOS
  80. | 'r'    // Macintosh
  81. | 'n'    // Unix (the right way)
  82. )
  83. { newline; }
  84. )+
  85. { %setType(ANTLR_COMMON_TOKEN::SKIP); }
  86. ;