public InterpreterAstContext(LanguageData language, OperatorHandler operatorHandler = null) : base(language) { OperatorHandler = operatorHandler ?? new OperatorHandler(language.Grammar.CaseSensitive); base.DefaultIdentifierNodeType = typeof(IdentifierNode); base.DefaultLiteralNodeType = typeof(LiteralValueNode); base.DefaultNodeType = null; }
public override void Initialize(AstContext context, ParseTreeNode treeNode) { base.Initialize(context, treeNode); var nodes = treeNode.GetMappedChildNodes(); Target = AddChild(NodeUseType.ValueWrite, "To", nodes[0]); //Get Op and baseOp if it is combined assignment AssignmentOp = nodes[1].FindTokenAndGetText(); if (string.IsNullOrEmpty(AssignmentOp)) { AssignmentOp = "="; } BinaryExpressionType = CustomExpressionTypes.NotAnExpression; //There maybe an "=" sign in the middle, or not - if it is marked as punctuation; so we just take the last node in child list Expression = AddChild(NodeUseType.ValueRead, "Expr", nodes[nodes.Count - 1]); AsString = AssignmentOp + " (assignment)"; // TODO: this is not always correct: in Pascal the assignment operator is :=. IsAugmented = AssignmentOp.Length > 1; if (IsAugmented) { var ictxt = context as InterpreterAstContext; if (ictxt == null) { throw new InvalidCastException(); } ExpressionType = ictxt.OperatorHandler.GetOperatorExpressionType(AssignmentOp); BinaryExpressionType = OperatorHandler.GetBinaryOperatorForAugmented(ExpressionType); Target.UseType = NodeUseType.ValueReadWrite; } }
public override void Initialize(AstContext context, ParseTreeNode treeNode) { base.Initialize(context, treeNode); var nodes = treeNode.GetMappedChildNodes(); OpSymbol = nodes[0].FindTokenAndGetText(); Argument = AddChild("Arg", nodes[1]); AsString = OpSymbol + "(unary op)"; ExpressionType = OperatorHandler.GetUnaryOperatorExpressionType(OpSymbol); }