Пример #1
0
        static void BuildJLispExprValueChildren(AbstractSyntaxRuleNode ruleNode, List <Value> children)
        {
            foreach (var astChild in ruleNode.Children)
            {
                if ((astChild is AbstractSyntaxTerminalNode) &&
                    (new List <string> {
                    "OPENPARENS", "CLOSEPARENS", "OPENBRACE", "CLOSEBRACE"
                }.
                     Contains((astChild.As <AbstractSyntaxTerminalNode>()).TerminalSymbol.Name)))
                {
                    continue;
                }
                else if (astChild is AbstractSyntaxRuleNode &&
                         astChild.As <AbstractSyntaxRuleNode>().ProductionRule.Name.Equals("Expr", StringComparison.Ordinal) &&
                         astChild.As <AbstractSyntaxRuleNode>().Children.Count == 1 &&
                         astChild.As <AbstractSyntaxRuleNode>().Children[0] is AbstractSyntaxTerminalNode &&
                         astChild.As <AbstractSyntaxRuleNode>().Children[0].As <AbstractSyntaxTerminalNode>().TerminalSymbol.Name.Equals("COMMENT", StringComparison.Ordinal))
                {
                    continue;
                }

                else
                {
                    children.Add(FromASTNode(astChild));
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Consumes an ASTNode + Child elements to produce a JListValue node + Child elements.
        /// </summary>
        /// <returns>The ASTN ode.</returns>
        /// <param name="astNode">Ast node.</param>
        internal static Value FromASTNode(AbstractSyntaxNode astNode)
        {
            AbstractSyntaxTerminalNode terminalNode = astNode.As <AbstractSyntaxTerminalNode>();
            AbstractSyntaxRuleNode     ruleNode     = astNode.As <AbstractSyntaxRuleNode>();

            if (terminalNode != null)
            {
                if (terminalNode.TerminalSymbol.Name.Equals("NUMBER", StringComparison.Ordinal))
                {
                    long l;
                    if (long.TryParse(terminalNode.Value, out l))
                    {
                        return(new LongValue(l));
                    }
                    else
                    {
                        return(new ErrorValue($"Invalid number '{terminalNode.Value}'."));
                    }
                }
                else if (terminalNode.TerminalSymbol.Name.Equals("SYMBOL", StringComparison.Ordinal))
                {
                    return(new SymbolValue(terminalNode.Value));
                }
                else if (terminalNode.TerminalSymbol.Name.Equals("STRING", StringComparison.Ordinal))
                {
                    return(StringValue.ReadRegexString(terminalNode.Value));
                }
                else if (terminalNode.TerminalSymbol.Name.Equals("COMMENT", StringComparison.Ordinal))
                {
                    return(new SExprValue());
                }
            }
            else if (ruleNode != null)
            {
                if (new string[] { "JLisp", "SExpr" }.Contains(ruleNode.ProductionRule.Name))
                {
                    var s = new SExprValue();
                    BuildJLispExprValueChildren(ruleNode, s.Cell);
                    return(s);
                }
                else if (ruleNode.ProductionRule.Name.Equals("QExpr", StringComparison.Ordinal))
                {
                    var q = new QExprValue();
                    BuildJLispExprValueChildren(ruleNode, q.Cell);
                    return(q);
                }
                else if (ruleNode.ProductionRule.Name.Equals("Expr", StringComparison.Ordinal))
                {
                    return(FromASTNode(ruleNode.Children[0])); // Should only be one !!
                }
            }

            return(new ErrorValue("No handling for astNode: " + astNode));
        }