예제 #1
0
        public void VarDefinitionTests()
        {
            string            txt               = "var=123";
            AntlrInputStream  inputStream       = new AntlrInputStream(txt);
            BogieLangLexer    lexer             = new BogieLangLexer(inputStream);
            CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
            BogieLangParser   parser            = new BogieLangParser(commonTokenStream);

            BogieLangParser.VarDefinitionContext varDefinitionContext = parser.varDefinition();
            BogieLangBaseVisitor <object>        visitor = new BogieLangBaseVisitor <object>();

            visitor.Visit(varDefinitionContext);
            VarDefinition varDefinition = VarDefinition.Compile(varDefinitionContext);

            Assert.True(varDefinition.Identifier == "var");
            Assert.True(varDefinition.Expression.Literal.Integer == 123);


            txt                  = "var=funcCall(\"arg\")";
            inputStream          = new AntlrInputStream(txt);
            lexer                = new BogieLangLexer(inputStream);
            commonTokenStream    = new CommonTokenStream(lexer);
            parser               = new BogieLangParser(commonTokenStream);
            varDefinitionContext = parser.varDefinition();
            visitor              = new BogieLangBaseVisitor <object>();
            visitor.Visit(varDefinitionContext);
            varDefinition = VarDefinition.Compile(varDefinitionContext);
            Assert.True(varDefinition.Identifier == "var");
            Assert.True(varDefinition.Expression.FunctionCall.Identifier == "funcCall");
        }
        public void AddVariable(string name, string code, [CallerLineNumber] int l = 0)
        {
            code = Replace(code);
            var v = new VarDefinition(name, code);

            Vars.Add(v);
        }
        public Node VarDef()
        {
            var varDefinition = new VarDefinition()
            {
                AnchorToken = Expect(TokenCategory.VAR)
            };

            varDefinition.Add(VarList());
            Expect(TokenCategory.SEMICOLON);
            return(varDefinition);
        }
        public void Visit(VarDefinition node)
        {
            var identifierList = node[0];

            foreach (var n in identifierList)
            {
                var id = n.AnchorToken.Value;
                if (Variables.Contains(id, Scope))
                {
                    throw new SemanticError("Duplicated variable '" + id + "' on " + Scope, n.AnchorToken);
                }
                Variables.Add(new Variable(id, Scope));
            }
        }
예제 #5
0
        public string Visit(VarDefinition node)
        {
            var result = "";

            if (!isGlobal)
            {
                foreach (var child in node[0])
                {
                    var varName = child.AnchorToken.Value;
                    Variables.Add(new Variable(varName, Scope));
                    result += "\t\t.locals init (int32 '" + varName + "')\n";
                }
                return(result);
            }
            foreach (var child in node[0])
            {
                var varName = child.AnchorToken.Value;
                Variables.Add(new Variable(varName, Scope));
                result += "\t.field private static int32 '" + varName + "'\n";
            }
            return(result);
        }
예제 #6
0
        public void VarDefinitionTests()
        {
            VariableEnvironment variables           = new VariableEnvironment();
            FunctionEnvironment functionEnvironment = new FunctionEnvironment();

            variables.DeclareVariable("var", BogieLangType.INTEGER);
            string            txt               = "var=123";
            AntlrInputStream  inputStream       = new AntlrInputStream(txt);
            BogieLangLexer    lexer             = new BogieLangLexer(inputStream);
            CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
            BogieLangParser   parser            = new BogieLangParser(commonTokenStream);

            BogieLangParser.VarDefinitionContext varDefinitionContext = parser.varDefinition();
            BogieLangBaseVisitor <object>        visitor = new BogieLangBaseVisitor <object>();

            visitor.Visit(varDefinitionContext);
            VarDefinition varDefinition = VarDefinition.Compile(varDefinitionContext);

            varDefinition.Execute(functionEnvironment, variables);
            Assert.True(variables["var"].BogieLangType == BogieLangType.INTEGER);
            Assert.True(variables["var"].Value is int);
            Assert.True((int)variables["var"].Value == 123);
        }
        private VarDefinition ParseVarDefinition()
        {
            var id = ParseIdentifier();

            var node = new VarDefinition();

            node.AddChild(id);

            var t = NextToken();

            if (t.IsOperator(Operator.Assign))
            {
                var expr = ParseExpression();

                node.AddChild(expr);
            }
            else if (t.IsDelimiter(Delimiter.BraceOpen))
            {
                node = new ArrayDefinition();
                node.AddChild(id);

                var expr = ParseExpression();
                node.AddChild(expr);

                t = NextToken();
                AssertDelimiter(Delimiter.BraceClose, t);

                node.PropagatePosition(t);
            }
            else
            {
                _stream.Previous();
            }

            return(node);
        }