void ProcessDocument(Document document) { var lexed = new LexedDocument(document, options.Report); lexedDocuments[document.Path] = lexed; if (document.IsCompilable) { var parser = new CParser(); var name = System.IO.Path.GetFileNameWithoutExtension(document.Path); Add(parser.ParseTranslationUnit(options.Report, name, Include, lexedDocuments["_machine.h"].Tokens, lexed.Tokens)); } }
public static ColorSpan[] Colorize(string code, MachineInfo?machineInfo = null, Report.Printer?printer = null) { var report = new Report(printer); var mi = machineInfo ?? new MachineInfo(); var doc = new Document(DefaultCodePath, code); var lexed = new LexedDocument(doc, report); var compiler = new CCompiler(new CompilerOptions(mi, report, new[] { doc })); var exe = compiler.Compile(); IEnumerable <string> GetFuncs() { foreach (var f in mi.InternalFunctions) { yield return(f.Name); } foreach (var g in exe.Globals) { if (g.VariableType is CStructType) { yield return(g.Name); } } } var funcs = new HashSet <string> (GetFuncs()); var tokens = lexed.Tokens.Where(x => x.Kind != TokenKind.EOL).Select(ColorizeToken).ToArray(); return(tokens); ColorSpan ColorizeToken(Token token) => new ColorSpan { Index = token.Location.Index, Length = token.EndLocation.Index - token.Location.Index, Color = GetTokenColor(token), }; SyntaxColor GetTokenColor(Token token) { switch (token.Kind) { case TokenKind.INT: case TokenKind.SHORT: case TokenKind.LONG: case TokenKind.CHAR: case TokenKind.FLOAT: case TokenKind.DOUBLE: case TokenKind.BOOL: case TokenKind.TYPE_NAME: return(SyntaxColor.Type); case TokenKind.IDENTIFIER: if (token.Value is string s) { if (funcs.Contains(s)) { return(SyntaxColor.Function); } switch (s) { case "uint8_t": case "uint16_t": case "uint32_t": case "uint64_t": case "int8_t": case "int16_t": case "int32_t": case "int64_t": case "boolean": return(SyntaxColor.Type); case "include": case "define": case "ifdef": case "ifndef": case "elif": case "endif": return(SyntaxColor.Keyword); } } return(SyntaxColor.Identifier); case TokenKind.CONSTANT: if (token.Value is char) { return(SyntaxColor.String); } return(SyntaxColor.Number); case TokenKind.TRUE: case TokenKind.FALSE: return(SyntaxColor.Number); case TokenKind.STRING_LITERAL: return(SyntaxColor.String); default: if (token.Kind < 128 || Lexer.OperatorTokens.Contains(token.Kind)) { return(SyntaxColor.Operator); } else if (Lexer.KeywordTokens.Contains(token.Kind)) { switch (token.StringValue) { case "unsigned": case "signed": return(SyntaxColor.Type); default: return(SyntaxColor.Keyword); } } break; } return(SyntaxColor.Comment); } }