示例#1
0
        public void TestOperators()
        {
            CParser testparser = new CParser();

            String[] ExpressionsUse = {"12+5","{1,2,3}","14-12+5*Sqr(64)"};
            Object[] Expectedresults = {(object)17,(object)(new object[] {1f,2f,3f}).ToList(),14-12+5*8};
            int failcount=0;

            for (int i = 0; i < ExpressionsUse.Length; i++)
            {

                Object tempobject = testparser.Execute(ExpressionsUse[i]);
                if (Convert.ChangeType(tempobject, Expectedresults[i].GetType()).Equals( Expectedresults[i])
                    || (testparser.ResultToString(tempobject).Equals(testparser.ResultToString(Expectedresults[i])))
                    )
                //if (tempobject == Expectedresults[i])
                {
                    Debug.Print(ExpressionsUse[i] + " success. Result was " + testparser.ResultToString(tempobject));

                }
                else
                {
                    Debug.Print(ExpressionsUse[i] + " failed. Result was " + testparser.ResultToString(tempobject) + "Expected result was " + testparser.ResultToString(Expectedresults[i]));

                    failcount++;

                }

            }
            if (failcount > 0)
                Assert.Fail(failcount.ToString() + "/" + ExpressionsUse.Length + " tests failed.");
        }
示例#2
0
        public void ArrayAccessExpression(CParser.ArrayAccessExpression ArrayAccessExpression)
        {
            var LeftExpression = ArrayAccessExpression.Left;
            var LeftCType = (LeftExpression.GetCachedCType(this) as CBasePointerType);
            var LeftType = ConvertCTypeToType(LeftCType);
            var ElementCType = LeftCType.ElementCType;
            var ElementType = ConvertCTypeToType(ElementCType);
            var IndexExpression = ArrayAccessExpression.Index;

            DoGenerateAddress(false, () =>
            {
                Traverse(LeftExpression);
            });
            DoGenerateAddress(false, () =>
            {
                Traverse(new CParser.BinaryExpression(IndexExpression, "*", new CParser.SizeofTypeExpression(ElementCType)));
                //Traverse(IndexExpression);
            });

            //SafeILGenerator.Sizeof(ElementType);
            //SafeILGenerator.BinaryOperation(SafeBinaryOperator.MultiplySigned);

            SafeILGenerator.BinaryOperation(SafeBinaryOperator.AdditionSigned);

            // For fixed array types, get always the address?
            if (ElementCType is CArrayType && (ElementCType as CArrayType).Size != 0)
            {
            }
            else if (!GenerateAddress)
            {
                SafeILGenerator.LoadIndirect(ConvertCTypeToType(ElementCType));
            }
        }
示例#3
0
        public void Convert()
        {
            var lexer = new CLexer(rdr);
            var parser = new CParser(parserState, lexer);
            var declarations = parser.Parse();
            var symbolTable = new SymbolTable(platform)
            {
                NamedTypes = {
                    { "off_t", new PrimitiveType_v1 { Domain = Domain.SignedInt, ByteSize = 4 } },          //$BUGBUG: arch-dependent!
                    { "ssize_t", new PrimitiveType_v1 { Domain = Domain.SignedInt, ByteSize = 4 } },        //$BUGBUG: arch-dependent!
                    { "size_t", new PrimitiveType_v1 { Domain = Domain.UnsignedInt, ByteSize = 4 } },       //$BUGBUG: arch-dependent!
                    { "va_list", new PrimitiveType_v1 { Domain = Domain.Pointer, ByteSize = platform.PointerType.Size } }
                }
            };

            foreach (var decl in declarations)
            {
                symbolTable.AddDeclaration(decl);
            }

            var lib = new SerializedLibrary
            {
                Types = symbolTable.Types.ToArray(),
                Procedures = symbolTable.Procedures.ToList(),
            };
            var ser = SerializedLibrary.CreateSerializer();
            ser.Serialize(writer, lib);
        }
示例#4
0
 public void TypeDeclaration(CParser.TypeDeclaration TypeDeclaration)
 {
     var CStructType = TypeDeclaration.Symbol.CType.GetCUnionStructType();
     if (CStructType != null)
     {
         Console.WriteLine("");
         Console.WriteLine("\t/// <summary>");
         Console.WriteLine("\t/// </summary>");
         Console.WriteLine("\tpublic struct {0}", TypeDeclaration.Symbol.Name);
         Console.WriteLine("\t{");
         {
             for (int n = 0; n < CStructType.Items.Count; n++)
             {
                 var Item = CStructType.Items[n];
                 if (n != 0)
                 {
                     Console.WriteLine("");
                 }
                 Console.WriteLine("\t\t/// <summary>");
                 Console.WriteLine("\t\t/// </summary>");
                 Console.WriteLine("\t\tpublic {0} {1};", ConvertCTypeToTypeString(Item.CType), Item.Name);
             }
         }
         Console.WriteLine("\t}");
     }
 }
示例#5
0
 public void FunctionDeclaration(CParser.FunctionDeclaration FunctionDeclaration)
 {
     if (FunctionDeclaration.FunctionBody != null)
     {
         //Console.WriteLine(FunctionDeclaration.FunctionBody);
         Console.WriteLine("");
         Console.WriteLine("\t/// <summary>");
         Console.WriteLine("\t/// </summary>");
         foreach (var Parameter in FunctionDeclaration.CFunctionType.Parameters)
         {
             Console.WriteLine("\t/// <param name=\"{0}\"></param>", Parameter.Name);
         }
         if (ConvertCTypeToType(FunctionDeclaration.CFunctionType.Return) != typeof(void))
         {
             Console.WriteLine("\t/// <returns></returns>");
         }
         Console.WriteLine("\t[DllImport(DllName)]");
         string FunctionHeader = "";
         FunctionHeader += "static public";
         FunctionHeader += " " + ConvertCTypeToTypeString(FunctionDeclaration.CFunctionType.Return);
         FunctionHeader += " " + FunctionDeclaration.CFunctionType.Name;
         FunctionHeader += "(";
         FunctionHeader += String.Join(", ", FunctionDeclaration.CFunctionType.Parameters.Select(Item =>
         {
             return ConvertCTypeToTypeString(Item.CType) + " " + Item.Name;
         }));
         FunctionHeader += ")";
         Console.WriteLine("\t{0};", FunctionHeader);
         //ConvertCTypeToType(FunctionDeclaration.CFunctionType.Return);
     }
 }
示例#6
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]);
 }
示例#7
0
        public override CParser CreateCParser(TextReader rdr, ParserState?state)
        {
            state ??= new ParserState();
            var lexer  = new CLexer(rdr, CLexer.MsvcCeKeywords);
            var parser = new CParser(state, lexer);

            return(parser);
        }
示例#8
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]);
 }
示例#9
0
        public CLogicNodeList(CParser _parent)
        {
            m_Parent = _parent;
            m_OWS    = new CLogicNode(this);
            int a = -1;

            m_OWS.m_NodeNo = (byte)a;
        }
        private void Given_Parser(string cText)
        {
            var state   = new ParserState();
            var lexer   = new CLexer(new StringReader(cText), CLexer.MsvcKeywords);
            var cparser = new CParser(state, lexer);
            var attr    = cparser.Parse_AttributeSpecifier();

            this.sap = new ServiceAttributeParser(attr);
        }
示例#11
0
        public void TestParsingEmptyLexer()
        {
            var m = SetupMock(new Stack <Token <CTokenType> >());

            var p  = new CParser(m.Object);
            var sf = p.PerformParse();

            Assert.That(sf, Is.Not.Null);
        }
示例#12
0
        public CFunction(CParser ParentParser, String Functionname, String expression)
        {
            eventfunction = ParentParser.FunctionEvent;
            Name          = Functionname;
            VariableList newvariables = ParentParser.Variables;

            newvariables.Add("P", new object[] { });
            mParser = new CParser(expression, ParentParser, newvariables);
        }
示例#13
0
        public void TestParserThrowsExceptionIfLexerThrowsException()
        {
            var m = new Mock<ICLexer>();
            m.SetupGet(l => l.HasMoreTokens).Returns(true);
            m.Setup(l => l.GetNextToken(It.IsAny<bool>())).Throws(new Exception());

            var p = new CParser(m.Object);

            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#14
0
 public void Program(CParser.TranslationUnit Program)
 {
     Console.WriteLine("using System");
     Console.WriteLine("");
     Console.WriteLine("static public class Invoke");
     Console.WriteLine("{");
     Console.WriteLine("\tconst string DllName = \"mydll.dll\";");
     Traverse(Program.Declarations);
     Console.WriteLine("}");
 }
示例#15
0
        public void AddCode(string name, string code)
        {
            var pp = new Preprocessor(context.Report);

            pp.AddCode("machine.h", context.MachineInfo.HeaderCode);
            pp.AddCode(name, code);
            var lexer  = new Lexer(pp);
            var parser = new CParser();

            Add(parser.ParseTranslationUnit(lexer));
        }
示例#16
0
        private static DeclarationListener GetDeclarationListener(CommonTokenStream commonTokenStream)
        {
            CParser parser = new CParser(commonTokenStream);

            parser.RemoveParseListeners();
            var declarationListener = new DeclarationListener();

            parser.AddParseListener(declarationListener);
            parser.blockItemList();
            return(declarationListener);
        }
示例#17
0
        TranslationUnit Parse(string code)
        {
            var report = new Report(new TestPrinter());
            var pp     = new Preprocessor(report);

            pp.AddCode("stdin", code);
            var lexer  = new Lexer(pp);
            var parser = new CParser();

            return(parser.ParseTranslationUnit(lexer, report));
        }
示例#18
0
        public void TestParserThrowsExceptionIfLexerThrowsException()
        {
            var m = new Mock <ICLexer>();

            m.SetupGet(l => l.HasMoreTokens).Returns(true);
            m.Setup(l => l.GetNextToken(It.IsAny <bool>())).Throws(new Exception());

            var p = new CParser(m.Object);

            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#19
0
        public void TestMethod8()
        {
            var Node = CParser.StaticParseBlock(@"
				{
					int a = 0, b = 1;

					if (a == 0 && b == 1) {
						printf(""Hello World!"");
					} else {
						int c = 7 + atoi(""8"");
					}
				}
			"            );

            Console.WriteLine(Node.ToYaml());
            CollectionAssert.AreEqual(
                new string[] {
                "- CompoundStatement:",
                "   - DeclarationList:",
                "      - VariableDeclaration: int a",
                "         - BinaryExpression: =",
                "            - IdentifierExpression: a",
                "            - IntegerExpression: 0",
                "      - VariableDeclaration: int b",
                "         - BinaryExpression: =",
                "            - IdentifierExpression: b",
                "            - IntegerExpression: 1",
                "   - IfElseStatement:",
                "      - BinaryExpression: &&",
                "         - BinaryExpression: ==",
                "            - IdentifierExpression: a",
                "            - IntegerExpression: 0",
                "         - BinaryExpression: ==",
                "            - IdentifierExpression: b",
                "            - IntegerExpression: 1",
                "      - ExpressionStatement:",
                "         - FunctionCallExpression:",
                "            - IdentifierExpression: printf",
                "            - ExpressionCommaList:",
                "               - StringExpression: Hello World!",
                "      - VariableDeclaration: int c",
                "         - BinaryExpression: =",
                "            - IdentifierExpression: c",
                "            - BinaryExpression: +",
                "               - IntegerExpression: 7",
                "               - FunctionCallExpression:",
                "                  - IdentifierExpression: atoi",
                "                  - ExpressionCommaList:",
                "                     - StringExpression: 8",
            },
                Node.ToYamlLines().ToArray()
                );
        }
示例#20
0
        CType ParseType(string code)
        {
            var report = new Report(new TestPrinter());
            var pp     = new Preprocessor(report);

            pp.AddCode("stdin", code);
            var lexer  = new Lexer(pp);
            var parser = new CParser();
            var tu     = parser.ParseTranslationUnit(lexer, report);

            return(tu.Variables[0].VariableType);
        }
示例#21
0
        public void TestParsingInvalidFirstToken()
        {
            Stack <Token <CTokenType> > tokens = new Stack <Token <CTokenType> >();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.TERMINATOR));

            var p = new CParser(m.Object);

            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#22
0
        public void TestStringConcatTest()
        {
            var Node = CParser.StaticParseExpression(@" ""a"" ""b"" ");

            Console.WriteLine(Node.ToYaml());
            CollectionAssert.AreEqual(
                new string[] {
                "- StringExpression: ab",
            },
                Node.ToYamlLines().ToArray()
                );
        }
示例#23
0
        public void TestCast()
        {
            var Node = CParser.StaticParseExpression("(unsigned int *)a");

            Console.WriteLine(Node.ToYaml());
            CollectionAssert.AreEqual(
                new string[] {
                "- CastExpression: unsigned int *",
            },
                Node.ToYamlLines().ToArray()
                );
        }
示例#24
0
        public void TestParsingUnterminatedPPDefinition()
        {
            Stack <Token <CTokenType> > tokens = new Stack <Token <CTokenType> >();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "define"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);

            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#25
0
        public void TestParsingElseWithNoStartingIf()
        {
            Stack <Token <CTokenType> > tokens = new Stack <Token <CTokenType> >();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "else"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);

            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#26
0
        public void TestParsingInvalidPPDirectiveVerb()
        {
            Stack <Token <CTokenType> > tokens = new Stack <Token <CTokenType> >();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.KEYWORD));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);

            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#27
0
        public void ParseC() {
            var inputStream = new AntlrInputStream(@"
int main(int argc, char **args) {
	printf(args[0]);
	return 0;
}");
            var lexer = new CLexer(inputStream);
            var commonTokenStream = new CommonTokenStream(lexer);
            var parser = new CParser(commonTokenStream);
            var visitor = new CstBuilderForAntlr4(parser);
            visitor.Visit(parser.compilationUnit());
            Console.WriteLine(visitor.FinishParsing());
        }
        public void TestMethod9()
        {
            var Node = CParser.StaticParseTranslationUnit(@"
				int n = 5;
				typedef unsigned int uint;

				uint m;

				void main(int argc, char** argv) {
					if (n < 10) {
						printf(""Hello World!: %d"", n);
					} else {
						prrintf(""Test!"");
					}
				}

			"            );

            Console.WriteLine(Node.ToYaml());
            CollectionAssert.AreEqual(
                new string[] {
                "- TranslationUnit:",
                "   - VariableDeclaration: int n",
                "      - BinaryExpression: =",
                "         - IdentifierExpression: n",
                "         - IntegerExpression: 5",
                "   - TypeDeclaration: typedef unsigned int uint",
                "   - VariableDeclaration: typedef unsigned int m",
                "      - (null)",
                "   - FunctionDeclaration: void main (int argc, char * * argv)",
                "      - CompoundStatement:",
                "         - IfElseStatement:",
                "            - BinaryExpression: <",
                "               - IdentifierExpression: n",
                "               - IntegerExpression: 10",
                "            - ExpressionStatement:",
                "               - FunctionCallExpression:",
                "                  - IdentifierExpression: printf",
                "                  - ExpressionCommaList:",
                "                     - StringExpression: Hello World!: %d",
                "                     - IdentifierExpression: n",
                "            - ExpressionStatement:",
                "               - FunctionCallExpression:",
                "                  - IdentifierExpression: prrintf",
                "                  - ExpressionCommaList:",
                "                     - StringExpression: Test!",
            },
                Node.ToYamlLines().ToArray()
                );
        }
示例#29
0
        public CParser CreateParser(string code)
        {
            ICharStream stream = CharStreams.fromstring(code);
            var         lexer  = new CLexer(stream);

            lexer.AddErrorListener(new ThrowExceptionErrorListener());
            ITokenStream tokens = new CommonTokenStream(lexer);
            var          parser = new CParser(tokens);

            parser.BuildParseTree = true;
            parser.RemoveErrorListeners();
            parser.AddErrorListener(new ThrowExceptionErrorListener());
            return(parser);
        }
示例#30
0
        public void TestEmptyFunctionCall()
        {
            var Node = CParser.StaticParseExpression("func()");

            Console.WriteLine(Node.ToYaml());
            CollectionAssert.AreEqual(
                new string[] {
                "- FunctionCallExpression:",
                "   - IdentifierExpression: func",
                "   - ExpressionCommaList:",
            },
                Node.ToYamlLines().ToArray()
                );
        }
示例#31
0
        public void TestParsingInvalidInclude2()
        {
            Stack <Token <CTokenType> > tokens = new Stack <Token <CTokenType> >();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.PUNCTUATOR, "."));
            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "include"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);

            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#32
0
        public void ParseC()
        {
            var inputStream       = new AntlrInputStream(@"
int main(int argc, char **args) {
	printf(args[0]);
	return 0;
}");
            var lexer             = new CLexer(inputStream);
            var commonTokenStream = new CommonTokenStream(lexer);
            var parser            = new CParser(commonTokenStream);
            var visitor           = new CstBuilderForAntlr4(parser);

            visitor.Visit(parser.compilationUnit());
            Console.WriteLine(visitor.FinishParsing());
        }
示例#33
0
        public void TestSimpleCompound()
        {
            var Node = CParser.StaticParseBlock("{ ; ; ; }");

            Console.WriteLine(Node.ToYaml());
            CollectionAssert.AreEqual(
                new string[] {
                "- CompoundStatement:",
                "   - CompoundStatement:",
                "   - CompoundStatement:",
                "   - CompoundStatement:",
            },
                Node.ToYamlLines().ToArray()
                );
        }
示例#34
0
        public void TestIncrementDereference2()
        {
            var Node = CParser.StaticParseExpression("**ptr++");

            Console.WriteLine(Node.ToYaml());
            CollectionAssert.AreEqual(
                new string[] {
                "- DereferenceExpression: *",
                "   - DereferenceExpression: *",
                "      - UnaryExpression: ++ (Right)",
                "         - IdentifierExpression: ptr",
            },
                Node.ToYamlLines().ToArray()
                );
        }
示例#35
0
        public void TestParsingUnknownPPDirective()
        {
            Stack <Token <CTokenType> > tokens = new Stack <Token <CTokenType> >();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "pragma"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p  = new CParser(m.Object);
            var sf = p.PerformParse();

            Assert.That(sf, Is.Not.Null);
            m.Verify(l => l.SkipToNextLine());
        }
示例#36
0
        void ProcessDocument(Document document)
        {
            var lexed = new LexedDocument(document, options.Report);

            lexedDocuments[document.Path] = lexed;

            if (document.IsCompilable)
            {
                var parser = new CParser();

                var name = System.IO.Path.GetFileNameWithoutExtension(document.Path);

                Add(parser.ParseTranslationUnit(options.Report, name, Include, lexedDocuments["_machine.h"].Tokens, lexed.Tokens));
            }
        }
示例#37
0
        public void TestParsingInvalidPPFunctionDefinitionWithParameters5()
        {
            Stack <Token <CTokenType> > tokens = new Stack <Token <CTokenType> >();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.PUNCTUATOR, "("));
            tokens.Push(GenerateToken(CTokenType.SYMBOL, "CTokenType"));
            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "define"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);

            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#38
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);
        }
示例#39
0
        public static Type CompileProgram(string CProgram, bool SaveTemp = false)
        {
            var CILConverter = new CILConverter(SaveAssembly: SaveTemp);

            CILConverter.Initialize("Program" + UniqueCounter++ + ".exe");
            var CPreprocessor = new CPreprocessor();

            CPreprocessor.PreprocessString(CProgram);
            var PreprocessedCProgram = CPreprocessor.TextWriter.ToString();

            var CCompiler       = new CCompiler();
            var TranslationUnit = CParser.StaticParseTranslationUnit(PreprocessedCProgram);

            (CILConverter as ICConverter).ConvertTranslationUnit(CCompiler, TranslationUnit);
            return(CILConverter.RootTypeBuilder);
        }
示例#40
0
文件: Main.cs 项目: dfneto/comdd
        public static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                string inputFileName = args[0];
                if (!Path.IsPathRooted(inputFileName))
                {
                    inputFileName = Path.Combine(Environment.CurrentDirectory, inputFileName);
                }
                ICharStream input = new ANTLRFileStream(inputFileName);
                CLexer lex = new CLexer(input);
                CommonTokenStream tokens = new CommonTokenStream(lex);
                CParser parser = new CParser(tokens);

                try {
                    parser.translation_unit();
                }
                catch(RecognitionException re) {
                    Console.Out.WriteLine(re.StackTrace);
                }
            }
            else
                Console.Error.WriteLine("Usage: cparse <input-file>");
        }
示例#41
0
        public void TestParsingBasicPPDefinition()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.SYMBOL, "FDSA"));
            tokens.Push(GenerateToken(CTokenType.SYMBOL, "CTokenType"));
            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "define"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);

            var c = p.PerformParse();

            Assert.That(c, Is.Not.Null);
            Assert.That(c.PreProcessorDefinitions, Is.Not.Empty);

            var pp = c.PreProcessorDefinitions.First();
            Assert.That(pp, Is.Not.Null);
            Assert.That(pp.Identifier, Is.EqualTo("CTokenType"));
            Assert.That(pp.Arguments, Is.Null);
            Assert.That(pp.Replacement, Is.EqualTo("FDSA"));
        }
示例#42
0
        public void TestParsingElifWithNoStartingIf()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "elif"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);

            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#43
0
        public void TestParsingValidIfndefCondition()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.NUMERIC_LITERAL, "TEST"));
            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "ifndef"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);
            var sf = p.PerformParse();
            Assert.That(sf, Is.Not.Null);
            var str = sf.PopIfCond();
            Assert.That(str, Is.Not.Null);
            Assert.That(str, Is.EqualTo("!defined(TEST)"));
        }
示例#44
0
        public void TestParsingUnterminatedStandardInclude()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.SYMBOL, "h"));
            tokens.Push(GenerateToken(CTokenType.PUNCTUATOR, "."));
            tokens.Push(GenerateToken(CTokenType.SYMBOL, "test"));
            tokens.Push(GenerateToken(CTokenType.PUNCTUATOR, "<"));
            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "include"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);
            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#45
0
        public void TestParsingValidEndif()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "endif"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL, "", 1));
            tokens.Push(GenerateToken(CTokenType.NUMERIC_LITERAL, "1"));
            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "if"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);
            var sf = p.PerformParse();
            Assert.That(() => sf.PopIfCond(), Throws.TypeOf(typeof(InvalidOperationException)));
        }
示例#46
0
        public void TestParsingIncludeStandard()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.PUNCTUATOR, ">"));
            tokens.Push(GenerateToken(CTokenType.SYMBOL, "h"));
            tokens.Push(GenerateToken(CTokenType.PUNCTUATOR, "."));
            tokens.Push(GenerateToken(CTokenType.SYMBOL, "test"));
            tokens.Push(GenerateToken(CTokenType.PUNCTUATOR, "<"));
            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "include"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);
            var sf = p.PerformParse();

            Assert.That(sf, Is.Not.Null);
            Assert.That(sf.IncludeList.Count, Is.EqualTo(1));
            Assert.That(sf.IncludeList.ElementAt(0).File, Is.EqualTo("test.h"));
            Assert.That(sf.IncludeList.ElementAt(0).IsStandard, Is.True);
        }
示例#47
0
        public void TestParsingUnterminatedPPDefinition()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "define"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);
            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#48
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="Operator"></param>
        /// <param name="Left"></param>
        /// <param name="Right"></param>
        private void DoBinaryOperation(string Operator, CParser.Expression Left, CParser.Expression Right)
        {
            bool EmitConstantValue = true;

            DoGenerateAddress(false, () =>
            {
                var LeftConstant = Left.GetCachedConstantValue(null);
                var RightConstant = Right.GetCachedConstantValue(null);

                // Optimization.
                if ((LeftConstant != null) && (RightConstant != null))
                {
                    //Console.WriteLine("{0} {1} {2}", LeftConstant, Operator, RightConstant);
                    if (LeftConstant.GetType() == typeof(int) && RightConstant.GetType() == typeof(int))
                    {
                        int LeftConstantValue = (int)LeftConstant;
                        int RightConstantValue = (int)RightConstant;
                        switch (Operator)
                        {
                            case "+": SafeILGenerator.Push(LeftConstantValue + RightConstantValue); return;
                            case "-": SafeILGenerator.Push(LeftConstantValue - RightConstantValue); return;
                            case "*": SafeILGenerator.Push(LeftConstantValue * RightConstantValue); return;
                            case "/": SafeILGenerator.Push(LeftConstantValue / RightConstantValue); return;
                            default:
                                Console.Error.WriteLine("Unoptimized binary operator {0}", Operator);
                                break;
                        }
                    }
                }

                Traverse(Left);
                _DoBinaryLeftRightPost(Operator);
                Traverse(Right);
                _DoBinaryLeftRightPost(Operator);
                EmitConstantValue = false;
            });

            if (!EmitConstantValue)
            {
                var LeftCType = Left.GetCachedCType(this).GetCSimpleType();
                var RightCType = Right.GetCachedCType(this).GetCSimpleType();
                _DoBinaryOperation(Operator, LeftCType.Sign);
            }
        }
示例#49
0
 public void ConvertTranslationUnit(CCompiler CCompiler, CParser.TranslationUnit Program)
 {
     Console.WriteLine(Program.ToYaml());
 }
示例#50
0
        public void TestParsingInvalidPPDirectiveVerb()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.KEYWORD));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);
            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#51
0
        public void TestParsingInvalidPPFunctionDefinitionWithParameters5()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.PUNCTUATOR, "("));
            tokens.Push(GenerateToken(CTokenType.SYMBOL, "CTokenType"));
            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "define"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);

            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#52
0
        public void TestParsingInvalidInclude()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.INVALID));
            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "include"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);
            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#53
0
        public void TestParsingInvalidFirstToken()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.TERMINATOR));

            var p = new CParser(m.Object);

            Assert.That(() => p.PerformParse(), Throws.TypeOf(typeof(ParserException)));
        }
示例#54
0
        public void TestParsingIncludeStringLiteral()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.STRING_LITERAL, "\"test.h\""));
            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "include"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);
            var sf = p.PerformParse();

            Assert.That(sf, Is.Not.Null);
            Assert.That(sf.IncludeList.Count, Is.EqualTo(1));
            Assert.That(sf.IncludeList.ElementAt(0).File, Is.EqualTo("test.h"));
            Assert.That(sf.IncludeList.ElementAt(0).IsStandard, Is.False);
        }
示例#55
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="CCompiler"></param>
 /// <param name="TranslationUnit"></param>
 void ICConverter.ConvertTranslationUnit(CCompiler CCompiler, CParser.TranslationUnit TranslationUnit)
 {
     this.CCompiler = CCompiler;
     Traverse(TranslationUnit);
 }
示例#56
0
 protected virtual void TraverseHook(Action Action, CParser.Node ParentNode, CParser.Node Node)
 {
     Action();
 }
示例#57
0
        public void TestParsingPPFunctionDefinitionWithParameters()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.SYMBOL, "FDSA"));
            tokens.Push(GenerateToken(CTokenType.PUNCTUATOR, ")"));
            tokens.Push(GenerateToken(CTokenType.SYMBOL, "b"));
            tokens.Push(GenerateToken(CTokenType.PUNCTUATOR, ","));
            tokens.Push(GenerateToken(CTokenType.SYMBOL, "a"));
            tokens.Push(GenerateToken(CTokenType.PUNCTUATOR, "("));
            tokens.Push(GenerateToken(CTokenType.SYMBOL, "CTokenType"));
            tokens.Push(GenerateToken(CTokenType.PP_DIRECTIVE, "define"));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);

            var c = p.PerformParse();

            Assert.That(c, Is.Not.Null);
            Assert.That(c.PreProcessorDefinitions, Is.Not.Empty);

            var pp = c.PreProcessorDefinitions.First();
            Assert.That(pp, Is.Not.Null);
            Assert.That(pp.Identifier, Is.EqualTo("CTokenType"));

            Assert.That(pp.Arguments, Is.Not.Null);
            Assert.That(pp.Arguments, Is.Not.Empty);
            var a = pp.Arguments.First();
            Assert.That(a, Is.Not.Null);
            Assert.That(a, Is.EqualTo("a"));
            var b = pp.Arguments.ElementAt(1);
            Assert.That(b, Is.Not.Null);
            Assert.That(b, Is.EqualTo("b"));

            Assert.That(pp.Replacement, Is.EqualTo("FDSA"));
        }
示例#58
0
        public void TestParsingEmptyLexer()
        {
            var m = SetupMock(new Stack<Token<CTokenType>>());

            var p = new CParser(m.Object);
            var sf = p.PerformParse();

            Assert.That(sf, Is.Not.Null);
        }
示例#59
0
        public void TestParsingUnknownPPDirectiveSymbol()
        {
            Stack<Token<CTokenType>> tokens = new Stack<Token<CTokenType>>();

            var m = SetupMock(tokens);

            tokens.Push(GenerateToken(CTokenType.SYMBOL));
            tokens.Push(GenerateToken(CTokenType.PP_SYMBOL));

            var p = new CParser(m.Object);
            var sf = p.PerformParse();

            Assert.That(sf, Is.Not.Null);
            m.Verify(l => l.SkipToNextLine());
        }
示例#60
0
 private void Lex(string str)
 {
     lexer = new CLexer(new StringReader(str));
     parser = new CParser(parserState, lexer);
 }