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

编译器/解释器

开发平台:

Others

  1. class PParser extends Parser;
  2. {
  3. public void traceOut(String rname) throws TokenStreamException  {
  4. System.out.println("exit "+rname+"; LT(1)="+LT(1));
  5. }
  6. public void traceIn(String rname) throws TokenStreamException  {
  7. System.out.println("enter "+rname+"; LT(1)="+LT(1));
  8. }
  9. /*
  10. public void consume() throws IOException {
  11. try {
  12. System.out.println(LT(1));
  13. }
  14. catch (IOException ignore) {}
  15. super.consume();
  16. }
  17. */
  18. }
  19. startRule
  20. : ( decl )+
  21. ;
  22. decl: INT a:ID {System.out.println("decl "+a.getText());}
  23. ( COMMA b:ID {System.out.println("decl "+b.getText());} )*
  24. SEMI
  25. ;
  26. {
  27. import java.io.*;
  28. }
  29. class PLexer extends Lexer;
  30. options {
  31. charVocabulary = '3'..'377';
  32. k=2;
  33. }
  34. tokens {
  35. INT="int";
  36. }
  37. {
  38. public void uponEOF() throws TokenStreamException, CharStreamException {
  39. if ( Main.selector.getCurrentStream() != Main.mainLexer ) {
  40. // don't allow EOF until main lexer.  Force the
  41. // selector to retry for another token.
  42. Main.selector.pop(); // return to old lexer/stream
  43. Main.selector.retry();
  44. }
  45. else {
  46. System.out.println("Hit EOF of main file");
  47. }
  48. }
  49. }
  50. SEMI: ';'
  51. ;
  52. COMMA
  53. : ','
  54. ;
  55. ID
  56. : ('a'..'z')+
  57. ;
  58. INCLUDE
  59. : "#include" (WS)? f:STRING
  60. {
  61. // create lexer to handle include
  62. String name = f.getText();
  63. DataInputStream input=null;
  64. try {
  65. FileInputStream fi = new FileInputStream(name);
  66.     input = new DataInputStream(fi);
  67. }
  68. catch (FileNotFoundException fnf) {
  69. System.err.println("cannot find file "+name);
  70. }
  71. PLexer sublexer = new PLexer(input);
  72. // make sure errors are reported in right file
  73. sublexer.setFilename(name);
  74. Main.parser.setFilename(name);
  75. // you can't just call nextToken of sublexer
  76. // because you need a stream of tokens to
  77. // head to the parser.  The only way is
  78. // to blast out of this lexer and reenter
  79. // the nextToken of the sublexer instance
  80. // of this class.
  81. Main.selector.push(sublexer);
  82. // ignore this as whitespace; ask selector to try
  83. // to get another token.  It will call nextToken()
  84. // of the new instance of this lexer.
  85. Main.selector.retry(); // throws TokenStreamRetryException
  86. }
  87. ;
  88. STRING
  89. : '"'! ( ~'"' )* '"'!
  90. ;
  91. WS : ( ' '
  92. | 't'
  93. | 'f'
  94. // handle newlines
  95. | ( options {generateAmbigWarnings=false;}
  96. : "rn"  // Evil DOS
  97. | 'r'    // Macintosh
  98. | 'n'    // Unix (the right way)
  99. )
  100. { newline(); }
  101. )+
  102. { $setType(Token.SKIP); }
  103. ;