#include <em_arith.h>
#include <em_label.h>
#include <em_code.h>
+#include <em_abs.h>
#include <assert.h>
#include "type.h"
return;
}
CodePExpr(left);
- CodeCheckExpr(left, tp);
+ CodeCheckExpr(left_type, tp);
}
CodeCheckExpr(tp1, tp2)
}
}
}
+ else if (tpl->tp_size <= tpr->tp_size &&
+ ((tpl->tp_fund == T_INTEGER && tpr == card_type) ||
+ (tpr->tp_fund == T_INTEGER && tpl == card_type))) {
+ label lb = ++text_label;
+
+ C_dup(word_size);
+ C_zge(lb);
+ C_loc((arith) ECONV);
+ C_trp();
+ C_df_ilb(lb);
+ }
+
}
Operands(leftop, rightop, tp)
}
+/* inline in declaration: need space
ProcedureDeclaration
{
struct def *df;
--proclevel;
}
;
+*/
ProcedureHeading(struct def **pdf; int type;)
{
} :
PROCEDURE IDENT
{ *pdf = DeclProc(type, dot.TOK_IDF); }
- FormalParameters(&pr, &parmaddr, &tp)?
+ [
+ '('
+ [
+ FPSection(&pr, &parmaddr)
+ [
+ ';' FPSection(&pr, &parmaddr)
+ ]*
+ ]?
+ ')'
+ [ ':' qualtype(&tp)
+ ]?
+ ]?
{ CheckWithDef(*pdf, proc_type(tp, pr, parmaddr));
if (tp && IsConstructed(tp)) {
warning(W_STRICT, "procedure \"%s\" has a constructed result type",
END
;
-declaration:
+declaration
+{
+ struct def *df;
+} :
CONST [ ConstantDeclaration ';' ]*
|
TYPE [ TypeDeclaration ';' ]*
|
VAR [ VariableDeclaration ';' ]*
|
- ProcedureDeclaration ';'
+ { ++proclevel; }
+ ProcedureHeading(&df, D_PROCEDURE)
+ ';'
+ block(&(df->prc_body))
+ IDENT
+ { EndProc(df, dot.TOK_IDF);
+ --proclevel;
+ }
+ ';'
|
ModuleDeclaration ';'
;
+/* inline in procedureheading: need space
FormalParameters(struct paramlist **ppr; arith *parmaddr; struct type **ptp;):
'('
[
[ ':' qualtype(ptp)
]?
;
+*/
FPSection(struct paramlist **ppr; arith *parmaddr;)
{