Beispiel #1
0
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);
   }
}
Beispiel #2
0
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);
   }
}
Beispiel #3
0
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;
   }
}
Beispiel #4
0
void Condition()
{
   Expression();
   Operator op = RelOp();
   Expression();
   Gener(BOP, op);
}
Beispiel #5
0
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;
   }
}
Beispiel #6
0
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;
   }
}
Beispiel #7
0
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;
   }
}
Beispiel #8
0
void Expression()
{
   if (Symb.type == MINUS) {
      Symb = readLexem();
      Term();
      Gener(UNM);
      ExpressionPrimed();
   } else {
      Term();
      ExpressionPrimed();
   }
}
Beispiel #9
0
void ElsePart(int adrIFJ)
{
   if (Symb.type == kwELSE) {
      Symb = readLexem();
      int adrJU = Gener(JU);
      PutIC(adrIFJ);
      Statement();
      PutIC(adrJU);
   } else {
      PutIC(adrIFJ);
   }
}
Beispiel #10
0
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);
   }
}
Beispiel #11
0
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__);
   }
}
Beispiel #12
0
void Program()
{
   Decl();
   CompoundStatement();
   Gener(STOP);
}
Beispiel #13
0
void Start(void)
{
   /* S -> E Stop */
   Expression();
   Gener(Stop, 0);
}