parse.mli 2.8 KB

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