Example #1
0
        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);
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
 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);
     }
 }
Example #4
0
        public void CParser_Typedef_Ulong()
        {
            Lex("typedef unsigned long ULONG;");
            var decl = parser.Parse_ExternalDecl();

            Debug.WriteLine(decl.ToString());
            Assert.IsTrue(parser.IsTypeName("ULONG"));
        }