示例#1
0
 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]);
 }
示例#2
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;
 }
示例#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;
     }
 }
示例#4
0
 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;
     }
 }
示例#5
0
 private void Lex(string str)
 {
     lexer = new CLexer(new StringReader(str));
     parser = new CParser(parserState, lexer);
 }
示例#6
0
        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;
            }
        }
示例#7
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;
            }
        }