public virtual INode CreateNode(PseudoList item) { if (item == null) { throw new ArgumentNullException(nameof(item)); } try { var car = item.GetCarSymbolName(); INode node; switch (car) { case "EXACT-TEXT": node = new ExactTextNode( item.GetSingleKeywordArgument <StringAtom>(":value").Value, this.ParseTextClasses(item.GetAllKeywordArguments(":classes")), _isCaseSensitive, null, this.NodeFamily, item.GetItemName()); break; case "SOME-TEXT": node = new TextNode( this.ParseTextClasses(item.GetAllKeywordArguments(":classes")), null, this.NodeFamily, item.GetItemName()); break; case "MULTI-TEXT": node = new MultiTextNode( item.GetAllKeywordArguments(":values").Cast <StringAtom>().Select(x => x.Value), this.ParseTextClasses(item.GetAllKeywordArguments(":classes")), _isCaseSensitive, null, this.NodeFamily, item.GetItemName()); break; case "EXACT-PUNCTUATION": node = new ExactPunctuationNode( item.GetSingleKeywordArgument <StringAtom>(":value").Value.Single(), null, this.NodeFamily, item.GetItemName()); break; // todo: some-number? case "SOME-INTEGER": node = new IntegerNode( null, this.NodeFamily, item.GetItemName()); break; case "FALLBACK": var name = item.GetItemName(); if (name == null) { throw new BuildingException("Fallback node must have a name."); } node = new FallbackNode( this.CreateFallbackPredicate(name), this.NodeFamily, name); break; default: return(null); } return(node); } catch (Exception ex) { throw new BuildingException($"Could not build a node from item {item}.", ex); } }