Predicator.Visitors.StringVisitor (predicator v3.5.0)
View SourceVisitor that converts AST nodes back to string expressions.
This visitor implements the inverse of parsing - it takes an Abstract Syntax Tree and generates a readable string representation. This is useful for debugging, documentation, and round-trip testing.
Examples
iex> ast = {:literal, 42}
iex> Predicator.Visitors.StringVisitor.visit(ast, [])
"42"
iex> ast = {:identifier, "score"}
iex> Predicator.Visitors.StringVisitor.visit(ast, [])
"score"
iex> ast = {:comparison, :gt, {:identifier, "score"}, {:literal, 85}}
iex> Predicator.Visitors.StringVisitor.visit(ast, [])
"score > 85"
iex> ast = {:comparison, :eq, {:identifier, "name"}, {:literal, "John"}}
iex> Predicator.Visitors.StringVisitor.visit(ast, [])
~s(name = "John")
iex> ast = {:logical_and, {:literal, true}, {:literal, false}}
iex> Predicator.Visitors.StringVisitor.visit(ast, [])
"true AND false"
iex> ast = {:logical_not, {:literal, true}}
iex> Predicator.Visitors.StringVisitor.visit(ast, [])
"NOT true"
iex> ast = {:function_call, "len", [{:identifier, "name"}]}
iex> Predicator.Visitors.StringVisitor.visit(ast, [])
"len(name)"
iex> ast = {:object, []}
iex> Predicator.Visitors.StringVisitor.visit(ast, [])
"{}"
iex> ast = {:object, [{{:identifier, "name"}, {:literal, "John"}}]}
iex> Predicator.Visitors.StringVisitor.visit(ast, [])
~s({name: "John"})
iex> ast = {:object, [{{:string_literal, "first name"}, {:literal, "John"}}]}
iex> Predicator.Visitors.StringVisitor.visit(ast, [])
~s({"first name": "John"})
Summary
Functions
Visits an AST node and returns its string representation.
Functions
@spec visit( Predicator.Parser.ast(), keyword() ) :: binary()
Visits an AST node and returns its string representation.
Parameters
ast_node- The AST node to convert to a stringopts- Optional visitor options::parentheses-:minimal(default) |:explicit|:none:spacing-:normal(default) |:compact|:verbose
Returns
String representation of the AST node
Options
:parenthesescontrols parentheses generation::minimal- only add parentheses when necessary for precedence:explicit- add parentheses around all comparisons:none- never add parentheses (may change meaning!)
:spacingcontrols whitespace::normal- standard spacing: "score > 85":compact- minimal spacing: "score>85":verbose- extra spacing: "score > 85"