parser.mly 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. %{
  2. open Ast
  3. let loc lexbuf =
  4. (0, 0, 0, 0)
  5. sprintf "%s:%d:%d" pos.pos_fname pos.pos_lnum
  6. (pos.pos_cnum - pos.pos_bol + 1)
  7. %}
  8. /* Tokens */
  9. %token LPAREN RPAREN LBRACK RBRACK LBRACE RBRACE SEMICOL COMMA
  10. %token NOT ADD SUB MUL DIV MOD
  11. %token EQ NE LT LE GT GE
  12. %token AND OR
  13. %token ASSIGN IF ELSE WHILE DO FOR RETURN EXTERN EXPORT
  14. %token INT BOOL FLOAT VOID
  15. %token EOF
  16. %token <bool> BOOL_CONST
  17. %token <float> FLOAT_CONST
  18. %token <int> INT_CONST
  19. %token <string> ID
  20. /* Precedence */
  21. %right ASSIGN
  22. %left OR
  23. %left AND
  24. %left EQ NE
  25. %left LT LE GT GE
  26. %left ADD SUB
  27. %left MUL DIV MOD
  28. %right NOT NEG CAST
  29. %nonassoc IF
  30. %nonassoc ELSE
  31. /* Start symbol */
  32. %type <Ast.node> program
  33. %start program
  34. %%
  35. basic_type : FLOAT { Float }
  36. | INT { Int }
  37. | BOOL { Bool }
  38. program : decl*; EOF
  39. { Program $1 }
  40. decl : EXTERN; fun_header; SEMICOL
  41. { let (t, n, p) = $2 in FunDec(t, n, p) }
  42. | boption(EXPORT); fun_header; LBRACE; fun_body; RBRACE
  43. { let (t, n, p) = $2 in FunDef ($1, t, n, p, $4) }
  44. | EXTERN; basic_type; ID; SEMICOL
  45. { GlobalDec ($2, $3) }
  46. | EXTERN; t=basic_type; LBRACK; d=separated_list(COMMA, ID); RBRACK; n=ID; SEMICOL
  47. { GlobalDec (ArrayDec (t, d), n) }
  48. | boption(EXPORT); basic_type; ID; SEMICOL
  49. { GlobalDef ($1, $2, $3, None) }
  50. | boption(EXPORT); basic_type; ID; ASSIGN; expr; SEMICOL
  51. { GlobalDef ($1, $2, $3, Some $5) }
  52. | e=boption(EXPORT); t=basic_type; LBRACK; d=separated_list(COMMA, expr); RBRACK; n=ID; SEMICOL
  53. { GlobalDef (e, ArrayDef (t, d), n, None) }
  54. | e=boption(EXPORT); t=basic_type; LBRACK; d=separated_list(COMMA, expr); RBRACK; n=ID; ASSIGN; v=expr; SEMICOL
  55. { GlobalDef (e, ArrayDef (t, d), n, Some v) }
  56. fun_header : ret=basic_type; name=ID; LPAREN; params=separated_list(COMMA, param); RPAREN
  57. { (ret, name, params) }
  58. | VOID; name=ID; LPAREN; params=separated_list(COMMA, param); RPAREN
  59. { (Void, name, params) }
  60. param : basic_type; ID { Param ($1, $2) }
  61. fun_body : var_dec* local_fun_dec* statement* loption(return_statement)
  62. { $1 @ $2 @ $3 }
  63. local_fun_dec : fun_header; LBRACE; fun_body; RBRACE
  64. { let (t, n, p) = $1 in FunDef (false, t, n, p, $3) }
  65. var_dec : basic_type; ID; SEMICOL
  66. { VarDec ($1, $2, None) }
  67. | basic_type; ID; ASSIGN; expr; SEMICOL
  68. { VarDec ($1, $2, Some $4) }
  69. | t=basic_type; LBRACK; d=separated_list(COMMA, expr); RBRACK; n=ID; SEMICOL
  70. { VarDec (ArrayDef (t, d), n, None) }
  71. | t=basic_type; LBRACK; d=separated_list(COMMA, expr); RBRACK; n=ID; ASSIGN; v=expr; SEMICOL
  72. { VarDec (ArrayDef (t, d), n, Some v) }
  73. statement : ID; ASSIGN; expr; SEMICOL
  74. { Assign ($1, $3) }
  75. | name=ID; LPAREN; params=separated_list(COMMA, expr); RPAREN; SEMICOL
  76. { Expr (FunCall (name, params)) }
  77. | IF; LPAREN; expr; RPAREN; block
  78. { If ($3, $5) } %prec IF
  79. | IF; LPAREN; expr; RPAREN; block; ELSE; block
  80. { IfElse ($3, $5, $7) } %prec ELSE
  81. | WHILE; LPAREN; expr; RPAREN; block
  82. { While ($3, $5) }
  83. | DO; block; WHILE; LPAREN; expr; RPAREN; SEMICOL
  84. { DoWhile ($5, $2) }
  85. | FOR; LPAREN; INT; id=ID; ASSIGN; start=expr; COMMA; stop=expr; RPAREN; body=block
  86. { For (id, start, stop, IntConst 1, body) }
  87. | FOR; LPAREN; INT; id=ID; ASSIGN; start=expr; COMMA; stop=expr; COMMA; step=expr; RPAREN; body=block
  88. { For (id, start, stop, step, body) }
  89. return_statement : RETURN; expr; SEMICOL { [Return ($2)] }
  90. block : LBRACE; statement*; RBRACE { $2 }
  91. | statement { [$1] }
  92. expr : LPAREN; expr; RPAREN { $2 }
  93. | name=ID; LPAREN; params=separated_list(COMMA, expr); RPAREN
  94. { FunCall (name, params) }
  95. | ID { Var $1 }
  96. | l=expr; op=binop; r=expr { Binop (op, l, r) }
  97. | SUB; expr { Monop (Neg, $2) } %prec NEG
  98. | NOT; expr { Monop (Not, $2) }
  99. | LPAREN; basic_type; RPAREN; expr { TypeCast ($2, $4) } %prec CAST
  100. | FLOAT_CONST { FloatConst $1 }
  101. | INT_CONST { IntConst $1 }
  102. | BOOL_CONST { BoolConst $1 }
  103. | ID; array_const { Deref ($1, $2) }
  104. | array_const { ArrayConst $1 }
  105. array_const : LBRACK; values=separated_list(COMMA, expr); RBRACK { values }
  106. %inline binop : ADD { Add }
  107. | SUB { Sub }
  108. | MUL { Mul }
  109. | DIV { Div }
  110. | MOD { Mod }
  111. | EQ { Eq }
  112. | NE { Ne }
  113. | LT { Lt }
  114. | LE { Le }
  115. | GT { Gt }
  116. | GE { Ge }
  117. | AND { And }
  118. | OR { Or }
  119. %%