Predicator.Visitors.StringVisitor (predicator v3.4.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
:parentheses
controls parentheses generation::minimal
- only add parentheses when necessary for precedence:explicit
- add parentheses around all comparisons:none
- never add parentheses (may change meaning!)
:spacing
controls whitespace::normal
- standard spacing: "score > 85":compact
- minimal spacing: "score>85":verbose
- extra spacing: "score > 85"