private void ParseKag(string input, string title = "input") { ClearLog(); DateTime opStart = DateTime.Now; var reader = new StringSourceReader(title, input); var lexer = new Lexer(reader); var morpher = new Morpher(lexer); var parser = new KagParser(morpher); var sb = new StringBuilder(); int numErrors = 0; var errors = new StringBuilder(); IExpression expression = null; while (!(expression is EofExpression)) { expression?.Print(sb, true, 0); try { expression = parser.ParseExpression <DocumentExpression>(); } catch (ParseException ex) { string error = Environment.NewLine + ex.Position + Environment.NewLine + ex.GetType() + Environment.NewLine + ex.Message + Environment.NewLine; sb.AppendLine(error); errors.AppendLine(error); numErrors++; } catch (Exception ex) { string error = Environment.NewLine + ex.GetType() + Environment.NewLine + ex.Message + Environment.NewLine; sb.AppendLine(error); errors.AppendLine(error); numErrors++; } } if (DisplayOutput(title)) { Log(sb.ToString()); } if (errors.Length > 0) { Log(numErrors + " Errors:"); Log(errors.ToString()); } DateTime opEnd = DateTime.Now; TimeSpan duration = opEnd - opStart; Log($"Done in {duration.TotalMilliseconds}ms." + Environment.NewLine); }
private List <Token> ScanPreCode(string preCode, ContextFile fileContext) { if (string.IsNullOrEmpty(preCode)) { return(new List <Token>()); } StringSourceReader reader = new StringSourceReader(preCode); List <Token> tokens2 = ScanReaderTokens(reader, fileContext); foreach (var token in tokens2) { token.Line = -token.Line - 1; token.Col = token.Col - 1000;//方法体以行列区分,所以减去一些。 } return(tokens2); }
private List <LineTokenCollection> ScanTextCode(string code, ContextFile fileContext, int startLine) { if (string.IsNullOrEmpty(code)) { return(new List <LineTokenCollection>()); } StringSourceReader reader = new StringSourceReader(code); List <LineTokenCollection> tokens2 = ScanReaderTokens(reader, fileContext, startLine); //foreach (var token in tokens2) //{ // token.Line = -token.Line - 1; // token.Col = token.Col - 1000;//方法体以行列区分,所以减去一些。 //} return(tokens2); }
private void LexKag(string input, string title = "input") { ClearLog(); DateTime opStart = DateTime.Now; Token token; var reader = new StringSourceReader(title, input); var lexer = new Lexer(reader); var morpher = new Morpher(lexer); var sb = new StringBuilder(); do { try { token = morpher.ReadToken(); } catch (ParseException ex) { sb.AppendLine(Environment.NewLine + ex.Position + Environment.NewLine + ex.GetType() + Environment.NewLine + ex.Message + Environment.NewLine); break; } catch (Exception ex) { sb.AppendLine(Environment.NewLine + ex.GetType() + Environment.NewLine + ex.Message + Environment.NewLine); break; } if (DisplayOutput(title)) { sb.AppendLine(token.ToString()); } } while (token.Type != TokenType.Eof); DateTime opEnd = DateTime.Now; TimeSpan duration = opEnd - opStart; sb.AppendLine($"Done in {duration.TotalMilliseconds}ms." + Environment.NewLine); Log(sb.ToString()); }