public void ParseTypedef() { CreateLexer("typedef int GOO;"); CParser parser = new CParser(parserState, lexer); var decl = parser.Parse(); //Assert.AreEqual("int", td.TypeSpecifier.ToString()); //Assert.AreEqual("GOO", td.Declarators[0]); }
public override TypeLibrary Load(IPlatform platform, TypeLibrary dstLib) { var rdr = new StreamReader(new MemoryStream(bytes)); var lexer = new CLexer(rdr); var state = new ParserState(); var parser = new CParser(state, lexer); var symbolTable = new SymbolTable(platform); var declarations = parser.Parse(); var tldser = new TypeLibraryDeserializer(platform, true, dstLib); foreach (var decl in declarations) { ProcessDeclaration(decl, platform, tldser, symbolTable); } return dstLib; }
public ProcedureSignature BuildSignature(string str, Frame frame) { try { var lexer = new CLexer(new StringReader(str + ";")); var cstate = new ParserState(); var cParser = new CParser(cstate, lexer); var decl = cParser.Parse_ExternalDecl(); var sSig = symbolTable.AddDeclaration(decl) .OfType<SerializedSignature>() .FirstOrDefault(); if (sSig == null) return null; var ser = program.Platform.CreateProcedureSerializer(); return ser.Deserialize(sSig, frame); } catch (Exception ex) { Debug.Print("{0}\r\n{1}", ex.Message, ex.StackTrace); return null; } }
private bool TryParseSignature(string txtSignature, out Core.Serialization.Procedure_v1 sProc) { // save the user a keystroke. txtSignature = txtSignature + ";"; var lexer = new Core.CLanguage.CLexer(new StringReader(txtSignature)); var cstate = new Core.CLanguage.ParserState(); var cParser = new CParser(cstate, lexer); try { var decl = cParser.Parse_Decl(); sProc = null; if (decl == null) return false; var syms = new SymbolTable(); syms.AddDeclaration(decl); if (syms.Procedures.Count != 1) return false; sProc = (Core.Serialization.Procedure_v1) syms.Procedures[0]; return true; } catch { sProc = null; return false; } }
private void Lex(string str) { lexer = new CLexer(new StringReader(str)); parser = new CParser(parserState, lexer); }
public GlobalDataItem_v2 ParseGlobalDeclaration(string txtGlobal) { try { var lexer = new CLexer(new StringReader(txtGlobal + ";")); var symbols = program.CreateSymbolTable(); var oldVars = symbols.Variables.Count; var cstate = new ParserState(symbols.NamedTypes.Keys); var cParser = new CParser(cstate, lexer); var decl = cParser.Parse_ExternalDecl(); if (decl == null) return null; //$HACK: Relying on a side effect here to // get both the global type. Ew. symbols.AddDeclaration(decl); if (symbols.Variables.Count == oldVars) return null; return symbols.Variables.Last(); } catch (Exception ex) { Debug.Print("{0}\r\n{1}", ex.Message, ex.StackTrace); return null; } }
public ProcedureBase_v1 ParseFunctionDeclaration(string fnDecl) { try { var lexer = new CLexer(new StringReader(fnDecl + ";")); var symbols = program.CreateSymbolTable(); var oldProcs = symbols.Procedures.Count; var cstate = new ParserState(symbols.NamedTypes.Keys); var cParser = new CParser(cstate, lexer); var decl = cParser.Parse_ExternalDecl(); if (decl == null) return null; //$HACK: Relying on a side effect here to // get both the procedure name and the signature. Ew. symbols.AddDeclaration(decl); if (symbols.Procedures.Count == oldProcs) return null; return symbols.Procedures.Last(); } catch (Exception ex) { //$TODO: if user has supplied a signature that can't parse, // we must notify them in the diagnostics window with a // WARNING. Debug.Print("{0}\r\n{1}", ex.Message, ex.StackTrace); return null; } }