Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. static const size_t program_syncset[] = {TYPEDEF , INT , FLOAT , BOOL , CHAR , F_EOF};
  2. void program(FunctionList **fl, VarList **vl, TypeList **tl){
  3.     switch(token->value){
  4.         case TYPEDEF:{
  5.             match(TYPEDEF, program_syncset);
  6.             match(STRUCT, program_syncset);
  7.             match(LCURLYBRACKET, program_syncset);
  8.             Type *t = type();
  9.             VarList *vl1 = idList(t);
  10.             match(SEMICOLON, program_syncset);
  11.             VarList *vl2 = new VarList;
  12.             varDecl(&vl2);
  13.             if(vl2->name) vl1->addElement(vl2);
  14.             match(RCURLYBRACKET, program_syncset);
  15.             char* lexeme = match(ID, nullptr);
  16.             IDLiteral *id = nullptr;
  17.             if(lexeme) id = new IDLiteral(std::string(lexeme));
  18.             match(SEMICOLON, program_syncset);
  19.             if(!(*tl)) *tl = new TypeList(vl1, id, nullptr);
  20.             else{
  21.                 TypeList *tl1 = new TypeList(vl1, id, nullptr);
  22.                 (*tl)->addElement(tl1);
  23.             }
  24.             program(fl, vl, tl);
  25.             break;
  26.         }
  27.         case ID: case INT: case FLOAT: case BOOL: case CHAR:{
  28.             Type *t = type();
  29.             Pointer *p = pointer();
  30.             NameDecl *nd;
  31.             Type *po = nullptr;
  32.             if(p != nullptr){
  33.                 p->t = t;
  34.                 po = new Type(p);
  35.             }
  36.             char* lexeme = match(ID, program_syncset);
  37.             IDLiteral *id = nullptr;
  38.             if(lexeme) id = new IDLiteral(std::string(lexeme));
  39.             program1(fl, vl, tl, t, id);
  40.             break;
  41.         }
  42.         default:
  43.             //error
  44.             std::cerr << "Syntactic error (l: " << getLine() << " , c: "<< getColumn() <<" ): expected typedef, id, int, float, bool or char!" << std::endl;
  45.             panic_mode(program_syncset);
  46.             break;
  47.     }
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement