Exemple #1
0
 public void Visit(VariableExpressionNode node)
 {
     if (!_variables.Contains(node.Name))
     {
         _result.AddUnknownVariableError(node.Name, node.Position);
     }
 }
Exemple #2
0
        protected StatementNode GenerateEntryPoint(CompilerNode owner, IEnumerable <MethodNode> methods)
        {
            var result = new BlockNode(owner);

            var opDecl = new DeclarationNode(result);

            opDecl.identifier = "operation";
            opDecl.type       = new TypeNode(opDecl, TypeKind.String);
            result.declarations.Add(opDecl);

            var assSt = new StackAssignmentNode(result);

            assSt.declaration = opDecl;
            result.statements.Add(assSt);

            foreach (var method in methods)
            {
                if (method.visibility != Visibility.Public)
                {
                    continue;
                }

                var ifExpr   = new IfNode(result);
                var cmpExpr  = new BinaryExpressionNode(ifExpr);
                var leftExpr = new VariableExpressionNode(cmpExpr);
                leftExpr.declaration = opDecl;

                var rightExpr = new LiteralExpressionNode(cmpExpr);
                rightExpr.kind  = LiteralKind.String;
                rightExpr.value = method.name;

                cmpExpr.left      = leftExpr;
                cmpExpr.right     = rightExpr;
                cmpExpr.@operator = OperatorKind.Equals;

                var callSt = new CallNode(ifExpr);
                callSt.method = method;

                ifExpr.expr       = cmpExpr;
                ifExpr.trueBranch = callSt;

                result.statements.Add(ifExpr);
            }

            result.statements.Add(new ExitNode(result));
            return(result);
        }
Exemple #3
0
 public void Visit(VariableExpressionNode node)
 {
     _parts[node] = (Func <int>)(() => _variables[node.Name]);
 }
Exemple #4
0
        protected ExpressionNode ParseExpression(List <Token> tokens, ref int index, CompilerNode owner, int precedence = -1)
        {
            if (index >= tokens.Count)
            {
                throw new ParserException(tokens.Last(), ParserException.Kind.EndOfStream);
            }

            ExpressionNode term;

            if (tokens[index].text == "(")
            {
                index++;
                term = ParseExpression(tokens, ref index, owner);
                ExpectDelimiter(tokens, ref index, ")");
            }
            else
            if (Lexer.IsLiteral(tokens[index].kind))
            {
                LiteralKind litKind;

                var node = new LiteralExpressionNode(owner);
                node.value = ExpectLiteral(tokens, ref index, out litKind);
                node.kind  = litKind;
                term       = node;
            }
            else
            if (tokens[index].kind == Token.Kind.Operator)
            {
                var node = new UnaryExpressionNode(owner);
                node.op = tokens[index].text;
                index++;

                node.term = ParseExpression(tokens, ref index, node);
                term      = node;
            }
            else
            {
                var node = new VariableExpressionNode(owner);
                node.identifier = ExpectIdentifier(tokens, ref index, false);
                term            = node;
            }

            while (tokens[index].kind == Token.Kind.Operator)
            {
                var p = GetOperatorPrecedence(tokens[index].text);

                if (precedence < 0 || p > precedence)
                {
                    var expr = new BinaryExpressionNode(owner);

                    expr.left = term;

                    expr.@operator = ParseOperator(ExpectOperator(tokens, ref index));

                    expr.right = ParseExpression(tokens, ref index, expr, p);

                    term = expr;
                }
                else
                {
                    break;
                }
            }

            return(term);
        }