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

编译器/解释器

开发平台:

Others

  1. /*
  2.  * Make sure to run antlr.Tool on the lexer.g file first!
  3.  */
  4. options {
  5. mangleLiteralPrefix = "TK_";
  6. language = "Sather";
  7. }
  8. {
  9. class MAIN is
  10.    main ( args : ARRAY{STR} ) is
  11.       if ( args.size < 2 ) then
  12.  #OUT + "usage " + args[0] + " <filename>n";
  13.  return;
  14.       end;
  15.  
  16.       f : IFSTREAM := IFSTREAM::open_for_read( args[1] );
  17.       if ( void(f) ) then
  18.  #OUT + "file "" + args[1] + "" not foundn";
  19.  return;
  20.       end;
  21.       protect
  22.  lexer  ::= #TINYC_LEXER{ANTLR_COMMON_TOKEN}( f );
  23.  parser ::= #TINYC_PARSER{ANTLR_COMMON_TOKEN,ANTLR_COMMON_AST}( lexer );
  24.  parser.program;
  25.  
  26.  t ::= parser.ast;
  27.  #OUT + t.str_list + "n";
  28.  
  29.       when $ANTLR_RECOGNITION_EXCEPTION then
  30.  #ERR + "exception: " + exception.str + "n";  
  31.       end;
  32.       
  33.    end;
  34. end;
  35. }
  36. class TINYC_PARSER extends Parser;
  37. options {
  38. importVocab=TINYC; // use vocab generated by lexer
  39. buildAST = true;
  40. }
  41. program
  42. : ( declaration )* EOF
  43. ;
  44. declaration
  45. : (variable) => variable
  46. | function
  47. ;
  48. declarator
  49. : id:ID
  50. | STAR id2:ID
  51. ;
  52. variable
  53. : type_ declarator SEMI
  54. ;
  55. function
  56. : type_ id:ID LPAREN 
  57. (formalParameter (COMMA formalParameter)*)?
  58. RPAREN
  59. block
  60. ;
  61. formalParameter
  62. : type_ declarator
  63. ;
  64. type_: // "type" is keyword in Sather
  65. (
  66. TK_int
  67. | TK_char
  68. | id:ID
  69. )
  70. ;
  71. block
  72. : LCURLY ( statement )* RCURLY
  73. ;
  74. statement
  75. : (declaration) => declaration
  76. | expr SEMI
  77. | TK_if LPAREN expr RPAREN statement
  78. ( TK_else statement )?
  79. | TK_while LPAREN expr RPAREN statement
  80. | block
  81. ;
  82. expr: assignExpr
  83. ;
  84. assignExpr
  85. : aexpr (ASSIGN assignExpr)?
  86. ;
  87. aexpr
  88. : mexpr (PLUS mexpr)*
  89. ;
  90. mexpr
  91. : atom (STAR atom)*
  92. ;
  93. atom: ID
  94. | INT
  95. | CHAR_LITERAL
  96. | STRING_LITERAL
  97. ;