parse.mli 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. (** Parse Abstract Syntax Tree from input file content. *)
  2. (** This phase takes [FileContent] as input and outputs a corresponding [Ast].
  3. Syntax errors are caught and
  4. transformed into {!Types.LocError}, so that the error can be highlighted in
  5. the input file code.
  6. The global files [lexer.mll] and [parser.mly] implement the grammar
  7. specified by the CiviC language manual This includes the extensions of
  8. nested functions and multi-dimensional arrays. The entire CiviC grammar
  9. implementation is summarized below. Note that Menhir parser syntax is used
  10. on some occasions. {v
  11. basic_type:
  12. | FLOAT
  13. | INT
  14. | BOOL
  15. program:
  16. | decl* EOF
  17. decl:
  18. | EXTERN fun_header SEMICOL
  19. | boption(EXPORT) fun_header LBRACE fun_body RBRACE
  20. | EXTERN basic_type ID SEMICOL
  21. | EXTERN basic_type LBRACK dimlist RBRACK ID SEMICOL
  22. | boption(EXPORT) basic_type ID SEMICOL
  23. | boption(EXPORT) basic_type ID ASSIGN expr SEMICOL
  24. | boption(EXPORT) basic_type LBRACK separated_list(COMMA, expr) RBRACK ID SEMICOL
  25. fun_header:
  26. | basic_type ID LPAREN separated_list(COMMA, param) RPAREN
  27. | VOID ID LPAREN separated_list(COMMA, param) RPAREN
  28. param:
  29. | basic_type ID
  30. | basic_type LBRACK dimlist RBRACK ID
  31. dimlist:
  32. | ID
  33. | dimlist COMMA ID
  34. fun_body:
  35. | var_dec* local_fun_dec* statement* loption(return_statement)
  36. return_statement:
  37. | RETURN expr SEMICOL
  38. local_fun_dec:
  39. | fun_header LBRACE fun_body RBRACE
  40. var_dec:
  41. | basic_type ID SEMICOL
  42. | basic_type ID ASSIGN expr SEMICOL
  43. | basic_type LBRACK separated_list(COMMA, expr) RBRACK ID SEMICOL
  44. | basic_type LBRACK separated_list(COMMA, expr) RBRACK ID ASSIGN expr SEMICOL
  45. statement:
  46. | ID ASSIGN expr SEMICOL
  47. | ID LBRACK separated_list(COMMA, expr) RBRACK ASSIGN expr SEMICOL
  48. | ID LPAREN separated_list(COMMA, expr) RPAREN SEMICOL
  49. | IF LPAREN expr RPAREN block %prec IF
  50. | IF LPAREN expr RPAREN block ELSE block %prec ELSE
  51. | WHILE LPAREN expr RPAREN block
  52. | DO block WHILE LPAREN expr RPAREN SEMICOL
  53. | FOR LPAREN INT ID ASSIGN expr COMMA expr RPAREN block
  54. | FOR LPAREN INT ID ASSIGN expr COMMA expr COMMA expr RPAREN block
  55. block:
  56. | LBRACE statement* RBRACE
  57. | statement
  58. expr:
  59. | ID LPAREN separated_list(COMMA, expr) RPAREN
  60. | LPAREN expr RPAREN
  61. | ID
  62. | expr ADD expr
  63. | expr SUB expr
  64. | expr MUL expr
  65. | expr DIV expr
  66. | expr MOD expr
  67. | expr EQ expr
  68. | expr NE expr
  69. | expr LT expr
  70. | expr LE expr
  71. | expr GT expr
  72. | expr GE expr
  73. | expr AND expr
  74. | expr OR expr
  75. | SUB expr %prec NEG
  76. | NOT expr
  77. | LPAREN basic_type RPAREN expr %prec CAST
  78. | FLOAT_CONST
  79. | INT_CONST
  80. | BOOL_CONST
  81. | ID array_const
  82. | array_const
  83. array_const:
  84. | LBRACK separated_list(COMMA, expr) RBRACK v} *)
  85. (** Main phase function, called by {!Main}. *)
  86. val phase : Main.phase_func