📄 absyn.h
字号:
/*
* absyn.h - Abstract Syntax Header (Chapter 4)
*
* All types and functions declared in this header file begin with "A_"
* Linked list types end with "..list"
*/
/* Type Definitions */
typedef int A_pos;
typedef struct A_var_ *A_var;
typedef struct A_exp_ *A_exp;
typedef struct A_dec_ *A_dec;
typedef struct A_ty_ *A_ty;
typedef struct A_decList_ *A_decList;
typedef struct A_expList_ *A_expList;
typedef struct A_field_ *A_field;
typedef struct A_fieldList_ *A_fieldList;
typedef struct A_fundec_ *A_fundec;
typedef struct A_fundecList_ *A_fundecList;
typedef struct A_namety_ *A_namety;
typedef struct A_nametyList_ *A_nametyList;
typedef struct A_efield_ *A_efield;
typedef struct A_efieldList_ *A_efieldList;
typedef enum {A_plusOp, A_minusOp, A_timesOp, A_divideOp,
A_eqOp, A_neqOp, A_ltOp, A_leOp, A_gtOp, A_geOp} A_oper;
struct A_var_
{enum {A_simpleVar, A_fieldVar, A_subscriptVar} kind;
A_pos pos;
union {S_symbol simple;
struct {A_var var;
S_symbol sym;} field;
struct {A_var var;
A_exp exp;} subscript;
} u;
};
struct A_exp_
{enum {A_varExp, A_nilExp, A_intExp, A_stringExp, A_callExp,
A_opExp, A_recordExp, A_seqExp, A_assignExp, A_ifExp,
A_whileExp, A_forExp, A_breakExp, A_letExp, A_arrayExp} kind;
A_pos pos;
union {A_var var;
/* nil; - needs only the pos */
int intt;
string stringg;
struct {S_symbol func; A_expList args;} call;
struct {A_oper oper; A_exp left; A_exp right;} op;
struct {S_symbol typ; A_efieldList fields;} record;
A_expList seq;
struct {A_var var; A_exp exp;} assign;
struct {A_exp test, then, elsee;} iff; /* elsee is optional */
struct {A_exp test, body;} whilee;
struct {S_symbol var; A_exp lo,hi,body; bool escape;} forr;
/* breakk; - need only the pos */
struct {A_decList decs; A_exp body;} let;
struct {S_symbol typ; A_exp size, init;} array;
} u;
};
struct A_dec_
{enum {A_functionDec, A_varDec, A_typeDec} kind;
A_pos pos;
union {A_fundecList function;
/* escape may change after the initial declaration */
struct {S_symbol var; S_symbol typ; A_exp init; bool escape;} var;
A_nametyList type;
} u;
};
struct A_ty_ {enum {A_nameTy, A_recordTy, A_arrayTy} kind;
A_pos pos;
union {S_symbol name;
A_fieldList record;
S_symbol array;
} u;
};
/* Linked lists and nodes of lists */
struct A_field_ {S_symbol name, typ; A_pos pos; bool escape;};
struct A_fieldList_ {A_field head; A_fieldList tail;};
struct A_expList_ {A_exp head; A_expList tail;};
struct A_fundec_ {A_pos pos;
S_symbol name; A_fieldList params;
S_symbol result; A_exp body;};
struct A_fundecList_ {A_fundec head; A_fundecList tail;};
struct A_decList_ {A_dec head; A_decList tail;};
struct A_namety_ {S_symbol name; A_ty ty;};
struct A_nametyList_ {A_namety head; A_nametyList tail;};
struct A_efield_ {S_symbol name; A_exp exp;};
struct A_efieldList_ {A_efield head; A_efieldList tail;};
/* Function Prototypes */
A_var A_SimpleVar(A_pos pos, S_symbol sym);
A_var A_FieldVar(A_pos pos, A_var var, S_symbol sym);
A_var A_SubscriptVar(A_pos pos, A_var var, A_exp exp);
A_exp A_VarExp(A_pos pos, A_var var);
A_exp A_NilExp(A_pos pos);
A_exp A_IntExp(A_pos pos, int i);
A_exp A_StringExp(A_pos pos, string s);
A_exp A_CallExp(A_pos pos, S_symbol func, A_expList args);
A_exp A_OpExp(A_pos pos, A_oper oper, A_exp left, A_exp right);
A_exp A_RecordExp(A_pos pos, S_symbol typ, A_efieldList fields);
A_exp A_SeqExp(A_pos pos, A_expList seq);
A_exp A_AssignExp(A_pos pos, A_var var, A_exp exp);
A_exp A_IfExp(A_pos pos, A_exp test, A_exp then, A_exp elsee);
A_exp A_WhileExp(A_pos pos, A_exp test, A_exp body);
A_exp A_ForExp(A_pos pos, S_symbol var, A_exp lo, A_exp hi, A_exp body);
A_exp A_BreakExp(A_pos pos);
A_exp A_LetExp(A_pos pos, A_decList decs, A_exp body);
A_exp A_ArrayExp(A_pos pos, S_symbol typ, A_exp size, A_exp init);
A_dec A_FunctionDec(A_pos pos, A_fundecList function);
A_dec A_VarDec(A_pos pos, S_symbol var, S_symbol typ, A_exp init);
A_dec A_TypeDec(A_pos pos, A_nametyList type);
A_ty A_NameTy(A_pos pos, S_symbol name);
A_ty A_RecordTy(A_pos pos, A_fieldList record);
A_ty A_ArrayTy(A_pos pos, S_symbol array);
A_field A_Field(A_pos pos, S_symbol name, S_symbol typ);
A_fieldList A_FieldList(A_field head, A_fieldList tail);
A_expList A_ExpList(A_exp head, A_expList tail);
A_fundec A_Fundec(A_pos pos, S_symbol name, A_fieldList params, S_symbol result,
A_exp body);
A_fundecList A_FundecList(A_fundec head, A_fundecList tail);
A_decList A_DecList(A_dec head, A_decList tail);
A_namety A_Namety(S_symbol name, A_ty ty);
A_nametyList A_NametyList(A_namety head, A_nametyList tail);
A_efield A_Efield(S_symbol name, A_exp exp);
A_efieldList A_EfieldList(A_efield head, A_efieldList tail);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -