00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef LIB_TRANSLATOR_H
00022 #define LIB_TRANSLATOR_H
00023
00024 #include <lib/scope.h>
00025 #include <lib/scope/stack.h>
00026 #include <lib/expression/dispatcher/binary.h>
00027 #include <lib/expression/dispatcher/unary.h>
00028 #include <lib/expression/smart_pointer.h>
00029 #include <lib/label/smart_pointer.h>
00030 #include <lib/statement/smart_pointer.h>
00031 #include <lib/type.h>
00032
00033 class expression_list;
00034 class name_type_list;
00035 class rcstring;
00036 class statement_list;
00037 class symbol;
00038 class symbol_function;
00039 class type_enumerated;
00040 class variable_name;
00041 class variable_name_list;
00042
00048 class translator
00049 {
00050 public:
00054 virtual ~translator();
00055
00059 translator();
00060
00065 void parse(const rcstring &filename);
00066
00072 void define_builtin_symbols();
00073
00083 expression::pointer sizeof_expression(
00084 const expression::pointer &arg);
00085
00098 type::pointer new_array_type(bool packed, const type::pointer &index_type,
00099 const type::pointer &subtype);
00100
00110 expression::pointer sizeof_expression(const type::pointer &arg);
00111
00112 protected:
00122 virtual expression::pointer sizeof_expression_factory(
00123 const expression::pointer &arg);
00124
00134 virtual expression::pointer sizeof_expression_factory(
00135 const type::pointer &arg) = 0;
00136
00137 public:
00153 scope::pointer program_scope(const rcstring &name);
00154
00155 protected:
00161 virtual scope::pointer program_scope_factory(const rcstring &name) = 0;
00162
00178 virtual symbol *function_symbol_factory(const rcstring &name,
00179 const scope::pointer &scp, int lex_level) = 0;
00180
00181 public:
00204 scope::pointer function_scope(const rcstring &name, bool is_func,
00205 bool new_seg);
00206
00207 protected:
00224 virtual scope::pointer function_scope_factory(const rcstring &name,
00225 bool is_func, bool new_seg) = 0;
00226
00227 public:
00232 void scope_attach_return_type(const type::pointer &tp);
00233
00240 bool current_function_definition_was_forward() const;
00241
00251 void scope_to_be_continued();
00252
00258 void scope_end();
00259
00280 void scope_attach_function_arguments(name_type_list *ntlp);
00281
00291 void constant_declaration(const variable_name &name,
00292 const expression::pointer &ep);
00293
00303 void type_declaration(const variable_name &name,
00304 const type::pointer &tp);
00305
00320 type::pointer type_lookup(const rcstring &name, bool deferable);
00321
00330 type::pointer string_type(const expression::pointer &size);
00331
00341 void variable_declaration(const variable_name_list &names,
00342 const type::pointer &tsp);
00343
00351 void scope_attach_body(const statement::pointer &sp);
00352
00362 virtual statement::pointer compound_statement_factory(
00363 statement_list *arg);
00364
00365 public:
00377 statement::pointer expression_statement(
00378 const expression::pointer &arg);
00379
00380 protected:
00390 virtual statement::pointer expression_statement_factory(
00391 const expression::pointer &arg);
00392
00393 public:
00408 statement::pointer if_statement(
00409 const expression::pointer &condition,
00410 const statement::pointer &then_clause,
00411 const statement::pointer &else_clause);
00412
00413 protected:
00427 virtual statement::pointer if_statement_factory(
00428 const expression::pointer &condition,
00429 const statement::pointer &then_clause,
00430 const statement::pointer &else_clause) = 0;
00431
00432 public:
00445 statement::pointer while_statement(
00446 const expression::pointer &condition,
00447 const statement::pointer &body);
00448
00449 protected:
00461 virtual statement::pointer while_statement_factory(
00462 const expression::pointer &condition,
00463 const statement::pointer &body) = 0;
00464
00465 public:
00478 statement::pointer until_statement(const statement::pointer &body,
00479 const expression::pointer &condition);
00480
00481 protected:
00493 virtual statement::pointer until_statement_factory(
00494 const statement::pointer &body,
00495 const expression::pointer &condition) = 0;
00496
00506 virtual statement::pointer infinite_loop_factory(
00507 const statement::pointer &body) = 0;
00508
00509 public:
00517 virtual statement::pointer empty_statement_factory();
00518
00533 virtual statement::pointer writeln_statement(expression_list *arg);
00534
00535 protected:
00546 virtual statement::pointer writeln_statement_factory(
00547 expression_list *arg) = 0;
00548
00549 public:
00565 expression::pointer function_call_expression(
00566 expression::pointer fname, expression_list *elp);
00567
00578 expression::pointer name_expression(const rcstring &name);
00579
00580 protected:
00590 virtual expression::pointer name_expression_factory(symbol *sp) = 0;
00591
00592 public:
00606 expression::pointer logical_and_expression(
00607 const expression::pointer &lhs,
00608 const expression::pointer &rhs);
00609
00610 protected:
00622 virtual expression::pointer logical_and_expression_factory(
00623 const expression::pointer &lhs,
00624 const expression::pointer &rhs) = 0;
00625
00626 public:
00640 expression::pointer logical_or_expression(
00641 const expression::pointer &lhs,
00642 const expression::pointer &rhs);
00643
00644 protected:
00656 virtual expression::pointer logical_or_expression_factory(
00657 const expression::pointer &lhs,
00658 const expression::pointer &rhs) = 0;
00659
00660 public:
00674 expression::pointer addition_expression(const expression::pointer &lhs,
00675 const expression::pointer &rhs);
00676
00677 protected:
00689 virtual expression::pointer integer_plus_integer_expression_factory(
00690 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
00691
00703 expression::pointer integer_plus_real_expression_factory(
00704 const expression::pointer &lhs, const expression::pointer &rhs);
00705
00717 expression::pointer real_plus_integer_expression_factory(
00718 const expression::pointer &lhs, const expression::pointer &rhs);
00719
00731 virtual expression::pointer real_plus_real_expression_factory(
00732 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
00733
00745 virtual expression::pointer set_union_expression_factory(
00746 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
00747
00748 public:
00762 expression::pointer subtraction_expression(const expression::pointer &lhs,
00763 const expression::pointer &rhs);
00764
00765 protected:
00777 virtual expression::pointer integer_minus_integer_expression_factory(
00778 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
00779
00791 expression::pointer integer_minus_real_expression_factory(
00792 const expression::pointer &lhs, const expression::pointer &rhs);
00793
00805 expression::pointer real_minus_integer_expression_factory(
00806 const expression::pointer &lhs, const expression::pointer &rhs);
00807
00819 virtual expression::pointer real_minus_real_expression_factory(
00820 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
00821
00833 virtual expression::pointer set_difference_expression_factory(
00834 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
00835
00836 public:
00850 expression::pointer multiplication_expression(
00851 const expression::pointer &lhs, const expression::pointer &rhs);
00852
00853 protected:
00865 virtual expression::pointer integer_times_integer_expression_factory(
00866 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
00867
00879 expression::pointer integer_times_real_expression_factory(
00880 const expression::pointer &lhs, const expression::pointer &rhs);
00881
00893 expression::pointer real_times_integer_expression_factory(
00894 const expression::pointer &lhs, const expression::pointer &rhs);
00895
00907 virtual expression::pointer real_times_real_expression_factory(
00908 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
00909
00921 virtual expression::pointer set_intersection_expression_factory(
00922 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
00923
00924 public:
00938 expression::pointer integer_division_expression(
00939 const expression::pointer &lhs,
00940 const expression::pointer &rhs);
00941
00942 protected:
00954 virtual expression::pointer integer_div_integer_expression_factory(
00955 const expression::pointer &lhs,
00956 const expression::pointer &rhs) = 0;
00957
00958 public:
00972 expression::pointer real_division_expression(
00973 const expression::pointer &lhs,
00974 const expression::pointer &rhs);
00975
00976 protected:
00988 expression::pointer integer_over_integer_expression_factory(
00989 const expression::pointer &lhs,
00990 const expression::pointer &rhs);
00991
01003 expression::pointer integer_over_real_expression_factory(
01004 const expression::pointer &lhs,
01005 const expression::pointer &rhs);
01006
01018 expression::pointer real_over_integer_expression_factory(
01019 const expression::pointer &lhs,
01020 const expression::pointer &rhs);
01021
01033 virtual expression::pointer real_over_real_expression_factory(
01034 const expression::pointer &lhs,
01035 const expression::pointer &rhs) = 0;
01036
01037 public:
01050 expression::pointer ge_expression(const expression::pointer &lhs,
01051 const expression::pointer &rhs);
01052
01053 protected:
01065 virtual expression::pointer boolean_ge_boolean_expression_factory(
01066 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01067
01079 expression::pointer enum_ge_enum_expression_factory(
01080 const expression::pointer &lhs, const expression::pointer &rhs);
01081
01093 virtual expression::pointer integer_ge_integer_expression_factory(
01094 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01095
01107 expression::pointer integer_ge_real_expression_factory(
01108 const expression::pointer &lhs, const expression::pointer &rhs);
01109
01121 expression::pointer real_ge_integer_expression_factory(
01122 const expression::pointer &lhs, const expression::pointer &rhs);
01123
01135 virtual expression::pointer real_ge_real_expression_factory(
01136 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01137
01149 virtual expression::pointer string_ge_string_expression_factory(
01150 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01151
01152 public:
01165 expression::pointer gt_expression(const expression::pointer &lhs,
01166 const expression::pointer &rhs);
01167
01168 protected:
01180 virtual expression::pointer boolean_gt_boolean_expression_factory(
01181 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01182
01194 expression::pointer enum_gt_enum_expression_factory(
01195 const expression::pointer &lhs, const expression::pointer &rhs);
01196
01208 virtual expression::pointer integer_gt_integer_expression_factory(
01209 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01210
01222 expression::pointer integer_gt_real_expression_factory(
01223 const expression::pointer &lhs, const expression::pointer &rhs);
01224
01236 expression::pointer real_gt_integer_expression_factory(
01237 const expression::pointer &lhs, const expression::pointer &rhs);
01238
01250 virtual expression::pointer real_gt_real_expression_factory(
01251 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01252
01264 virtual expression::pointer string_gt_string_expression_factory(
01265 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01266
01267 public:
01280 expression::pointer le_expression(const expression::pointer &lhs,
01281 const expression::pointer &rhs);
01282
01283 protected:
01295 virtual expression::pointer boolean_le_boolean_expression_factory(
01296 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01297
01309 expression::pointer enum_le_enum_expression_factory(
01310 const expression::pointer &lhs, const expression::pointer &rhs);
01311
01323 virtual expression::pointer integer_le_integer_expression_factory(
01324 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01325
01337 expression::pointer integer_le_real_expression_factory(
01338 const expression::pointer &lhs, const expression::pointer &rhs);
01339
01351 expression::pointer real_le_integer_expression_factory(
01352 const expression::pointer &lhs, const expression::pointer &rhs);
01353
01365 virtual expression::pointer real_le_real_expression_factory(
01366 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01367
01379 virtual expression::pointer string_le_string_expression_factory(
01380 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01381
01382 public:
01395 expression::pointer lt_expression(
01396 const expression::pointer &lhs,
01397 const expression::pointer &rhs);
01398
01399 protected:
01411 virtual expression::pointer boolean_lt_boolean_expression_factory(
01412 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01413
01425 expression::pointer enum_lt_enum_expression_factory(
01426 const expression::pointer &lhs, const expression::pointer &rhs);
01427
01439 virtual expression::pointer integer_lt_integer_expression_factory(
01440 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01441
01453 expression::pointer integer_lt_real_expression_factory(
01454 const expression::pointer &lhs, const expression::pointer &rhs);
01455
01467 expression::pointer real_lt_integer_expression_factory(
01468 const expression::pointer &lhs, const expression::pointer &rhs);
01469
01481 virtual expression::pointer real_lt_real_expression_factory(
01482 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01483
01495 virtual expression::pointer string_lt_string_expression_factory(
01496 const expression::pointer &lhs, const expression::pointer &rhs) = 0;
01497
01498 public:
01512 expression::pointer eq_expression(
01513 const expression::pointer &lhs,
01514 const expression::pointer &rhs);
01515
01516 protected:
01528 virtual expression::pointer boolean_eq_boolean_expression_factory(
01529 const expression::pointer &lhs,
01530 const expression::pointer &rhs) = 0;
01531
01543 expression::pointer enum_eq_enum_expression_factory(
01544 const expression::pointer &lhs, const expression::pointer &rhs);
01545
01557 virtual expression::pointer integer_eq_integer_expression_factory(
01558 const expression::pointer &lhs,
01559 const expression::pointer &rhs) = 0;
01560
01572 expression::pointer integer_eq_real_expression_factory(
01573 const expression::pointer &lhs,
01574 const expression::pointer &rhs);
01575
01587 expression::pointer real_eq_integer_expression_factory(
01588 const expression::pointer &lhs,
01589 const expression::pointer &rhs);
01590
01602 virtual expression::pointer real_eq_real_expression_factory(
01603 const expression::pointer &lhs,
01604 const expression::pointer &rhs) = 0;
01605
01617 virtual expression::pointer string_eq_string_expression_factory(
01618 const expression::pointer &lhs,
01619 const expression::pointer &rhs) = 0;
01620
01621 public:
01634 expression::pointer ne_expression(
01635 const expression::pointer &lhs,
01636 const expression::pointer &rhs);
01637
01638 protected:
01650 virtual expression::pointer boolean_ne_boolean_expression_factory(
01651 const expression::pointer &lhs,
01652 const expression::pointer &rhs) = 0;
01653
01665 expression::pointer enum_ne_enum_expression_factory(
01666 const expression::pointer &lhs, const expression::pointer &rhs);
01667
01679 virtual expression::pointer integer_ne_integer_expression_factory(
01680 const expression::pointer &lhs,
01681 const expression::pointer &rhs) = 0;
01682
01694 expression::pointer integer_ne_real_expression_factory(
01695 const expression::pointer &lhs,
01696 const expression::pointer &rhs);
01697
01709 expression::pointer real_ne_integer_expression_factory(
01710 const expression::pointer &lhs,
01711 const expression::pointer &rhs);
01712
01724 virtual expression::pointer real_ne_real_expression_factory(
01725 const expression::pointer &lhs,
01726 const expression::pointer &rhs) = 0;
01727
01739 virtual expression::pointer string_ne_string_expression_factory(
01740 const expression::pointer &lhs,
01741 const expression::pointer &rhs) = 0;
01742
01743 public:
01755 expression::pointer dereference_expression(
01756 const expression::pointer &arg);
01757
01758 protected:
01768 virtual expression::pointer dereference_expression_factory(
01769 const expression::pointer &arg) = 0;
01770
01771 public:
01781 virtual expression::pointer boolean_expression_factory(bool value) = 0;
01782
01792 virtual expression::pointer integer_expression_factory(
01793 const rcstring &value) = 0;
01794
01805 expression::pointer negate_expression(const expression::pointer &arg);
01806
01807 protected:
01817 virtual expression::pointer integer_negate_expression_factory(
01818 const expression::pointer &arg) = 0;
01819
01829 virtual expression::pointer real_negate_expression_factory(
01830 const expression::pointer &arg) = 0;
01831
01832 public:
01842 expression::pointer logical_not_expression(
01843 const expression::pointer &arg);
01844
01845 protected:
01855 virtual expression::pointer logical_not_expression_factory(
01856 const expression::pointer &arg) = 0;
01857
01858 public:
01866 expression::pointer empty_set_expression();
01867
01868 protected:
01880 virtual expression::pointer empty_set_expression_factory(
01881 const location &locn, const type::pointer &tp) = 0;
01882
01883 public:
01895 expression::pointer set_expression(const expression::pointer &lo,
01896 const expression::pointer &hi);
01897
01907 expression::pointer set_expression(const expression::pointer &singleton);
01908
01909 protected:
01921 virtual expression::pointer set_expression_factory(
01922 const expression::pointer &lo, const expression::pointer &hi) = 0;
01923
01933 virtual expression::pointer set_expression_factory(
01934 const expression::pointer &singleton) = 0;
01935
01936 public:
01948 virtual expression::pointer char_expression_factory(const location &locn,
01949 unsigned char value) = 0;
01950
01960 virtual expression::pointer real_expression_factory(
01961 const rcstring &value) = 0;
01962
01972 virtual expression::pointer string_expression_factory(
01973 const rcstring &value) = 0;
01974
01979 void traversal();
01980
01986 void enable_grammar_debug();
01987
01988 public:
01999 expression::pointer dereference_if_necessary(
02000 const expression::pointer &arg);
02001
02022 expression::pointer assignment_expression_factory(
02023 const expression::pointer &lhs,
02024 const expression::pointer &rhs);
02025
02035 virtual expression::pointer real_from_integer_expression_factory(
02036 const expression::pointer &arg) = 0;
02037
02048 expression::pointer dot_expression(const expression::pointer &lhs,
02049 const variable_name &rhs);
02050
02063 expression::pointer array_index_expression(const expression::pointer &lhs,
02064 const expression::pointer &rhs);
02065
02077 type::pointer subrange_type(const expression::pointer &minimum,
02078 const expression::pointer &maximum);
02079
02089 type::pointer set_type(const type::pointer &subtype);
02090
02091 protected:
02097 virtual void pre_order_traversal();
02098
02104 virtual void post_order_traversal();
02105
02106 public:
02117 bool is_current_function(symbol *sp) const;
02118
02124 virtual label::pointer label_factory();
02125
02138 int get_lex_level() const;
02139
02144 bool is_a_sysprog() const { return syscomp; }
02145
02149 void comment(const rcstring &text);
02150
02151 protected:
02158 virtual void comment_notify(const rcstring &text);
02159
02166 void interpret_comment(const rcstring &text);
02167
02174 virtual void codefile_bigendian();
02175
02182 virtual void codefile_copyright(const rcstring &text);
02183
02190 virtual void codefile_library(const rcstring &filename);
02191
02192 protected:
02204 virtual expression::pointer set2set_expression_factory(
02205 const type::pointer &to, const expression::pointer &from) = 0;
02206
02211 virtual symbol *builtin_chr_factory() = 0;
02212
02217 virtual symbol *builtin_dec_factory() = 0;
02218
02223 virtual symbol *builtin_inc_factory() = 0;
02224
02229 virtual symbol *builtin_odd_factory() = 0;
02230
02235 virtual symbol *builtin_ord_factory() = 0;
02236
02241 virtual symbol *builtin_pred_factory() = 0;
02242
02247 virtual symbol *builtin_sqr_factory() = 0;
02248
02253 virtual symbol *builtin_succ_factory() = 0;
02254
02259 virtual symbol *builtin_time_factory() = 0;
02260
02272 virtual symbol_function *builtin_syscall_factory(const rcstring &name,
02273 int proc_num) = 0;
02274
02275 public:
02282 bit_address get_data_mark() const;
02283
02295 void set_data_mark(const bit_address &arg);
02296
02301 bool issue_iocheck() const { return iocheck; }
02302
02307 bool issue_breakpoint() const { return breakpoints_flag; }
02308
02314 bool issue_range_check() const { return range_check; }
02315
02324 type::pointer record_begin(bool is_packed);
02325
02334 void record_member(variable_name_list &name, type::pointer &tp);
02335
02340 void record_end();
02341
02346 void with_begin(const expression::pointer &var);
02347
02352 void with_end();
02353
02364 bool is_a_type_name(const rcstring &name) const;
02365
02373 type::pointer enumerated_begin();
02374
02382 void enumerated_tag(const variable_name &name);
02383
02388 void enumerated_end();
02389
02390 private:
02396 bool debug;
02397
02402 scope_stack scopes;
02403
02408 scope::pointer builtins;
02409
02419 bool syscomp;
02420
02427 bool no_more_codefile_options;
02428
02434 bool iocheck;
02435
02443 bool breakpoints_flag;
02444
02449 bool goto_ok;
02450
02456 bool range_check;
02457
02463 type::pointer current_enum;
02464 type_enumerated *current_enum_raw;
02465
02470 expression_dispatcher_binary op_addition;
02471
02476 expression_dispatcher_binary op_subtraction;
02477
02482 expression_dispatcher_binary op_multiplication;
02483
02488 expression_dispatcher_binary op_div;
02489
02494 expression_dispatcher_binary op_division;
02495
02500 expression_dispatcher_binary op_eq;
02501
02506 expression_dispatcher_binary op_ne;
02507
02512 expression_dispatcher_binary op_lt;
02513
02518 expression_dispatcher_binary op_le;
02519
02524 expression_dispatcher_binary op_gt;
02525
02530 expression_dispatcher_binary op_ge;
02531
02536 expression_dispatcher_unary op_negate;
02537
02541 translator(const translator &);
02542
02546 translator &operator=(const translator &);
02547 };
02548
02549 #endif // LIB_TRANSLATOR_H