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); } }
public GlobalDataItem_v2?ParseGlobalDeclaration(string txtGlobal) { try { var lexer = new CLexer(new StringReader(txtGlobal + ";"), CLexer.GccKeywords); //$REVIEW: what's the right thing? var symbols = program.CreateSymbolTable(); var oldVars = symbols.Variables.Count; var cstate = new ParserState(symbols); 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 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); } }
public void CParser_Typedef_Ulong() { Lex("typedef unsigned long ULONG;"); var decl = parser.Parse_ExternalDecl(); Debug.WriteLine(decl.ToString()); Assert.IsTrue(parser.IsTypeName("ULONG")); }