Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static const size_t program_syncset[] = {TYPEDEF , INT , FLOAT , BOOL , CHAR , F_EOF};
- void program(FunctionList **fl, VarList **vl, TypeList **tl){
- switch(token->value){
- case TYPEDEF:{
- match(TYPEDEF, program_syncset);
- match(STRUCT, program_syncset);
- match(LCURLYBRACKET, program_syncset);
- Type *t = type();
- VarList *vl1 = idList(t);
- match(SEMICOLON, program_syncset);
- VarList *vl2 = new VarList;
- varDecl(&vl2);
- if(vl2->name) vl1->addElement(vl2);
- match(RCURLYBRACKET, program_syncset);
- char* lexeme = match(ID, nullptr);
- IDLiteral *id = nullptr;
- if(lexeme) id = new IDLiteral(std::string(lexeme));
- match(SEMICOLON, program_syncset);
- if(!(*tl)) *tl = new TypeList(vl1, id, nullptr);
- else{
- TypeList *tl1 = new TypeList(vl1, id, nullptr);
- (*tl)->addElement(tl1);
- }
- program(fl, vl, tl);
- break;
- }
- case ID: case INT: case FLOAT: case BOOL: case CHAR:{
- Type *t = type();
- Pointer *p = pointer();
- NameDecl *nd;
- Type *po = nullptr;
- if(p != nullptr){
- p->t = t;
- po = new Type(p);
- }
- char* lexeme = match(ID, program_syncset);
- IDLiteral *id = nullptr;
- if(lexeme) id = new IDLiteral(std::string(lexeme));
- program1(fl, vl, tl, t, id);
- break;
- }
- default:
- //error
- std::cerr << "Syntactic error (l: " << getLine() << " , c: "<< getColumn() <<" ): expected typedef, id, int, float, bool or char!" << std::endl;
- panic_mode(program_syncset);
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement