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 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; } }