Predicator.Visitors.StringVisitor (predicator v3.4.0)

View Source

Visitor 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

visit(ast_node, opts \\ [])

@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 string
  • opts - 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"