public bool Parse(bool onlyHeader = false) { var skipping = SkipTypes.Any(); var eofToken = (int)Tokens.EOF; var tok = _scanner.yylex(); int endEntityToken = ';'; while (tok != eofToken && !Cancel) { try { if (tok >= 63) { Tokens t = (Tokens)tok; switch (t) { case Tokens.HEADER: BeginHeader(); break; case Tokens.ENDSEC: if (_inHeader && onlyHeader) { return(true); } EndSec(); break; case Tokens.DATA: BeginData(); break; case Tokens.ENTITY: NewEntity(_scanner.yylval.strVal /*.AsSpan()*/); break; case Tokens.TYPE: var type = _scanner.yylval.strVal; if (skipping && SkipTypes.Contains(type)) { var current = _processStack.Pop(); //SkipEntities.Add(current.EntityLabel); while (tok != endEntityToken && tok != eofToken) { tok = _scanner.yylex(); } break; } if (!SetType(type)) { // move to the end of entity if we couldn't create it while (tok != endEntityToken && tok != eofToken) { tok = _scanner.yylex(); } } break; case Tokens.INTEGER: SetIntegerValue(_scanner.yylval.strVal); break; case Tokens.FLOAT: SetFloatValue(_scanner.yylval.strVal); break; case Tokens.STRING: SetStringValue(_scanner.yylval.strVal); break; case Tokens.BOOLEAN: SetBooleanValue(_scanner.yylval.strVal); break; case Tokens.IDENTITY: SetObjectValue(_scanner.yylval.strVal /*.AsSpan()*/); break; case Tokens.HEXA: SetHexValue(_scanner.yylval.strVal); break; case Tokens.ENUM: SetEnumValue(_scanner.yylval.strVal); break; case Tokens.NONDEF: SetNonDefinedValue(); break; case Tokens.OVERRIDE: SetOverrideValue(); break; case Tokens.TEXT: case Tokens.error: case Tokens.ILLEGALCHAR: throw new XbimParserException($"Unexpected scanner token {t.ToString()}, line {_scanner.yylloc.StartLine}, column {_scanner.yylloc.StartColumn}"); case Tokens.SCOPE: case Tokens.ENDSCOPE: case Tokens.ISOSTEPSTART: case Tokens.ISOSTEPEND: case Tokens.MISC: case Tokens.EOF: default: break; } } else { char c = (char)tok; switch (c) { case '(': BeginList(); break; case ')': EndList(); break; case ';': EndEntity(); break; case '/': case ',': case '=': default: break; } } // get next token tok = _scanner.yylex(); } //XbimParserException is a reason to terminate execution catch (XbimParserException e) { Logger?.LogError(LogEventIds.ParserFailure, e, e.Message); return(false); } //other exceptions might occure but those should just make the parser to wait for the next start of entity //and start from there catch (Exception e) { Logger?.LogError(LogEventIds.FailedEntity, e, e.Message); ErrorCount++; // clear current entity stack to make sure there are no residuals _processStack.Clear(); // scan until the beginning of next entity var entityToken = (int)Tokens.ENTITY; while (tok != eofToken && tok != entityToken) { tok = _scanner.yylex(); } } } EndParse(); return(ErrorCount == 0); }