void TermPrime(void) { switch (Symb.type) { case TIMES: /* T' -> * F BinOp T' */ Symb = readLexem(); Factor(); Gener(BinOp, '*'); /* BinOp.dop = '*' */ TermPrime(); break; case DIVIDE: /* T' -> / F BinOp T' */ Symb = readLexem(); Factor(); Gener(BinOp, '/'); /* BinOp.dop = '/' */ TermPrime(); break; case PLUS: case MINUS: case RPAR: case EOI: /* T' -> e */ break; default: ExpansionError("T'", Symb.type); } }
void ExpressionPrime(void) { switch (Symb.type) { case PLUS: /* E' -> + T BinOp E' */ Symb = readLexem(); Term(); Gener(BinOp, '+'); /* BinOp.dop = '+' */ ExpressionPrime(); break; case MINUS: /* E' -> - T BinOp E' */ Symb = readLexem(); Term(); Gener(BinOp, '-'); /* BinOp.dop = '-' */ ExpressionPrime(); break; case RPAR: case EOI: /* E' -> e */ break; default: ExpansionError("E'", Symb.type); } }
void GenTR(char *id) { int v; DruhId druh = idPromKonst(id, &v); switch (druh) { case IdProm: Gener(TA, v); Gener(DR); break; case IdKonst: Gener(TC, v); break; } }
void Condition() { Expression(); Operator op = RelOp(); Expression(); Gener(BOP, op); }
void Statement() { switch (Symb.type) { case IDENT: { Gener(TA, varAddr(Symb.ident)); Symb = readLexem(); Compare(ASSIGN, __LINE__); Expression(); Gener(ST); break; } case kwWRITE: Symb = readLexem(); Expression(); Gener(WRT); break; case kwREAD: Symb = readLexem(); char id[MAX_IDENT_LEN]; Compare_IDENT(id, __LINE__); Gener(TA, varAddr(id)); Gener(RD); Gener(ST); break; case kwIF: { Symb = readLexem(); Condition(); int adrIFJ = Gener(IFJ); Compare(kwTHEN, __LINE__); Statement(); ElsePart(adrIFJ); break; } case kwWHILE: { int a1 = GetIC(); Symb = readLexem(); Condition(); int aIFJ = Gener(IFJ); Compare(kwDO, __LINE__); Statement(); Gener(JU, a1); PutIC(aIFJ); break; } case kwBEGIN: CompoundStatement(); break; default: break; } }
void TermPrime() { switch (Symb.type) { case TIMES: Symb = readLexem(); Factor(); Gener(BOP, Times); TermPrime(); break; case DIVIDE: Symb = readLexem(); Factor(); Gener(BOP, Divide); TermPrime(); break; default: break; } }
void ExpressionPrimed() { switch (Symb.type) { case PLUS: Symb = readLexem(); Term(); Gener(BOP, Plus); ExpressionPrimed(); break; case MINUS: Symb = readLexem(); Term(); Gener(BOP, Minus); ExpressionPrimed(); break; default: break; } }
void Expression() { if (Symb.type == MINUS) { Symb = readLexem(); Term(); Gener(UNM); ExpressionPrimed(); } else { Term(); ExpressionPrimed(); } }
void ElsePart(int adrIFJ) { if (Symb.type == kwELSE) { Symb = readLexem(); int adrJU = Gener(JU); PutIC(adrIFJ); Statement(); PutIC(adrJU); } else { PutIC(adrIFJ); } }
void Factor(void) { switch (Symb.type) { case NUMB: { /* F -> c IntKonst */ int cshod = Compare_NUMB(); Gener(IntConst, cshod); break; } case LPAR: /* F -> ( E ) */ Symb = readLexem(); Expression(); Compare(RPAR); break; default: ExpansionError("F", Symb.type); } }
void Factor() { switch (Symb.type) { case IDENT: char id[MAX_IDENT_LEN]; Compare_IDENT(id, __LINE__); GenTR(id); break; case NUMB: int hodn; Compare_NUMB(&hodn, __LINE__); Gener(TC, hodn); break; case LPAR: { Symb = readLexem(); Expression(); Compare(RPAR, __LINE__); break; } default: ExpansionError("Factor", Symb.type, __LINE__); } }
void Program() { Decl(); CompoundStatement(); Gener(STOP); }
void Start(void) { /* S -> E Stop */ Expression(); Gener(Stop, 0); }