%option batch %option c++ %option noyywrap %option 8bit %option stack %option yyclass="ObjParser" %option prefix="objbase" %{ #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" #if __clang__ #pragma GCC diagnostic ignored "-Wnull-conversion" #endif #include #include #include #include #include class objbaseFlexLexer; %} comment #.* float -?[0-9.]+ index -?[0-9]+ linestring [^\r\n]* truthy (1|on) falsey (0|off) %x FACE %x MTLLIB %x OBJECT %x SMOOTH %x USEMTL %x VERTEX %x NORMAL %x TEXCOORD %% {comment} { // fprintf(stderr, "COMMENT %s\n", YYText()); } "f " { BEGIN(FACE); objects.back().second.emplace_back(); objects.back().second.back().emplace_back(); axis = 0; } "mtllib " { BEGIN(MTLLIB); } "o " { BEGIN(OBJECT); } "s " { BEGIN(SMOOTH); } "usemtl " { BEGIN(USEMTL); } "v " { BEGIN(VERTEX); vertices.emplace_back(0, 0, 0, 1); axis = 0; } "vn " { BEGIN(NORMAL); normals.emplace_back(0, 0, 0); axis = 0; } "vt " { BEGIN(TEXCOORD); texCoords.emplace_back(0, 1, 1); axis = 0; } {linestring} { // fprintf(stderr, "USEMTL <%s>\n", YYText()); } {linestring} { // fprintf(stderr, "MTLLIB <%s>\n", YYText()); } {linestring} { objects.emplace_back(YYText(), Faces{}); } {truthy} { // fprintf(stderr, "Set smooth\n"); } {falsey} { // fprintf(stderr, "Set flat\n"); } {float} { vertices.back()[axis++] = std::stof(YYText()); } {float} { normals.back()[axis++] = std::stof(YYText()); } {float} { texCoords.back()[axis++] = std::stof(YYText()); } {index} { objects.back().second.back().back()[axis] = std::stoi(YYText()); } \/ { axis++; } [ \t] { objects.back().second.back().emplace_back(); axis = 0; } <*>[ \t] { } <*>[\r\n\f] { BEGIN(INITIAL); } %% // Make iwyu think unistd.h is required [[maybe_unused]]static auto x=getpid;