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)); } } }
/// <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)); }