/home/archives/ucsd-psystem-xc/branch.0/branch.0/delta27403.167/lib/translator.h

Go to the documentation of this file.
00001 //
00002 // UCSD p-System cross compiler
00003 // Copyright (C) 2006 Peter Miller
00004 //
00005 // This program is free software; you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License as published by
00007 // the Free Software Foundation; either version 2 of the License, or (at
00008 // you option) any later version.
00009 //
00010 // This program is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00013 // General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU General Public License
00016 // along with this program; if not, write to the Free Software
00017 // Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307,
00018 // USA
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; // forward
00034 class name_type_list; // forward
00035 class rcstring; // forward
00036 class statement_list; // forward
00037 class symbol; // forward
00038 class symbol_function; // forward
00039 class type_enumerated; // forward
00040 class variable_name; // forward
00041 class variable_name_list; // forward
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

Generated on Sun Feb 25 01:27:10 2007 for UCSDp-SystemCrossCompiler by  doxygen 1.5.1