Documentation ¶
Overview ¶
Package ogdl is used to process OGDL, the Ordered Graph Data Language.
OGDL is a textual format to write trees or graphs of text, where indentation and spaces define the structure. Here is an example:
network ip 192.168.1.100 gw 192.168.1.9
The languange is simple, either in its textual representation or its number of productions (the specification rules), allowing for compact implementations.
OGDL character streams are normally formed by Unicode characters, and encoded as UTF-8 strings, but any encoding that is ASCII transparent is compatible with the specification.
See the full spec at http://ogdl.org.
Installation ¶
To install this package just do:
go get github.com/rveen/ogdl
An example ¶
If we have a text file 'config.ogdl' containing:
eth0 ip 192.168.1.1 gateway 192.168.1.10 mask 255.255.255.0 timeout 20
then,
g := ogdl.FromFile("config.ogdl") ip := g.Get("eth0.ip").String() to := g.Get("eth0.timeout").Int64(60) println("ip:",ip,", timeout:",to)
will print
ip: 192.168.1.1, timeout: 20
If the timeout parameter was not present, then the default value (60) will be assigned to 'to'. The default value is optional, but be aware that Int64() will return 0 in case that the parameter doesn't exist.
The configuration file can be written in a conciser way:
eth0 ip 192.168.1.1 gateway 192.168.1.10 mask 255.255.255.0 timeout 20
A template example ¶
The package includes a template processor. It takes an arbitrary input stream with some variables in it, and produces an output stream with the variables resolved out of a Graph object which acts as context.
For example (given the previous config file):
g := ogdl.FromFile("config.ogdl") t := ogdl.NewTemplate("The gateway's IP is $eth0.gateway") b := t.Process(g)
string(b) is then:
The gateway's IP is 192.168.1.10
Function signature conventions ¶
Some rules are followed:
.<Type>() Return the first subnode content converted to the specified type. .This<Type>() Return the node content itself converted to the specified type. .Get() Return the specified path as a (possible nil) *Graph object. .Get<Type>() Return the specified path converted to the specified type. These series of functions return value and error.
Index ¶
- Constants
- Variables
- func IsBreakChar(c byte) bool
- func IsDigit(c rune) bool
- func IsEndChar(c byte) bool
- func IsEndRune(c rune) bool
- func IsLetter(c rune) bool
- func IsSpaceChar(c byte) bool
- func IsTextChar(c byte) bool
- type Graph
- func FromBinary(b []byte) *Graph
- func FromBinaryFile(file string) *Graph
- func FromBinaryReader(r io.Reader) *Graph
- func FromBytes(b []byte) *Graph
- func FromFile(s string) *Graph
- func FromJSON(buf []byte) (*Graph, error)
- func FromReader(r io.Reader) *Graph
- func FromString(s string) *Graph
- func FromStringTypes(s string) *Graph
- func New(n interface{}) *Graph
- func NewExpression(s string) *Graph
- func NewPath(s string) *Graph
- func NewTemplate(s string) *Graph
- func NewTemplateFromBytes(b []byte) *Graph
- func (g *Graph) Add(n interface{}) *Graph
- func (g *Graph) AddNodes(g2 *Graph) *Graph
- func (g *Graph) Binary() []byte
- func (g *Graph) Bool(def ...bool) bool
- func (g *Graph) Bytes() []byte
- func (g *Graph) Check(x *Graph) (bool, string)
- func (g *Graph) Clear()
- func (g *Graph) Clone() *Graph
- func (g *Graph) Copy(c *Graph)
- func (g *Graph) Create(s string) *Graph
- func (g *Graph) Delete(n interface{})
- func (g *Graph) DeleteAt(i int)
- func (g *Graph) Equals(c *Graph) bool
- func (g *Graph) Eval(e *Graph) (interface{}, error)
- func (g *Graph) Find(re string) (*Graph, error)
- func (g *Graph) Float64(def ...float64) float64
- func (g *Graph) Get(s string) *Graph
- func (g *Graph) GetAt(i int) *Graph
- func (g *Graph) GetBool(path string) (bool, error)
- func (g *Graph) GetBytes(path string) ([]byte, error)
- func (g *Graph) GetFloat64(path string) (float64, error)
- func (g *Graph) GetInt64(path string) (int64, error)
- func (g *Graph) GetString(path string) (string, error)
- func (g *Graph) Html(path string) string
- func (g *Graph) Int64(def ...int64) int64
- func (g *Graph) Interface() interface{}
- func (g *Graph) JSON() []byte
- func (g *Graph) Len() int
- func (g *Graph) Node(s string) *Graph
- func (g *Graph) NodeOrNew(s string) *Graph
- func (g *Graph) Number() interface{}
- func (g *Graph) Process(ctx *Graph) []byte
- func (g *Graph) Scalar() interface{}
- func (g *Graph) Set(s string, val interface{}) *Graph
- func (g *Graph) Show() string
- func (g *Graph) SortAsInt(field string)
- func (g *Graph) SortAsString(field string)
- func (g *Graph) String(def ...string) string
- func (g *Graph) StringCSV(def ...string) string
- func (g *Graph) StringTxt(def ...string) string
- func (g *Graph) Strings() []string
- func (g *Graph) Substitute(s string, v interface{})
- func (g *Graph) Text() string
- func (g *Graph) ThisBytes() []byte
- func (g *Graph) ThisFloat64() (float64, bool)
- func (g *Graph) ThisInt64() (int64, bool)
- func (g *Graph) ThisNumber() interface{}
- func (g *Graph) ThisScalar() interface{}
- func (g *Graph) ThisString(def ...string) string
- func (g *Graph) ThisType() string
- func (g *Graph) ThisValue() reflect.Value
- func (g *Graph) Value() reflect.Value
- type Lexer
- func (p *Lexer) Block(nsp int) (string, bool)
- func (p *Lexer) Break() bool
- func (p *Lexer) Byte() (byte, error)
- func (p *Lexer) Comment() bool
- func (p *Lexer) End() bool
- func (p *Lexer) Error() error
- func (p *Lexer) Integer() (string, bool)
- func (p *Lexer) Number() (string, bool)
- func (p *Lexer) Operator() (string, bool)
- func (p *Lexer) PeekByte() byte
- func (p *Lexer) PeekRune() (rune, error)
- func (p *Lexer) Quoted(ind int) (string, bool, error)
- func (p *Lexer) Rune() (rune, error)
- func (p *Lexer) Scalar(n int) (string, bool)
- func (p *Lexer) ScalarType(n int) (interface{}, bool)
- func (p *Lexer) Space() (int, byte)
- func (p *Lexer) String() (string, bool)
- func (p *Lexer) StringStop(stopBytes []byte) (string, bool)
- func (p *Lexer) TemplateText() (string, bool)
- func (p *Lexer) Token8() (string, bool)
- func (p *Lexer) UnreadByte()
- func (p *Lexer) UnreadRune() error
- func (p *Lexer) WhiteSpace() bool
- type Log
- func (log *Log) Add(g *Graph) int64
- func (log *Log) AddBinary(b []byte) int64
- func (log *Log) Bytes() []byte
- func (log *Log) Close()
- func (log *Log) Get(i int64) (*Graph, int64, error)
- func (log *Log) GetBinary(i int64) ([]byte, int64, error)
- func (log *Log) SetSync(sync bool)
- func (log *Log) Sync()
- type Parser
- func (p *Parser) ArgList() bool
- func (p *Parser) Args(dot bool) (bool, error)
- func (p *Parser) Dec()
- func (p *Parser) Emit(s string)
- func (p *Parser) Expression() bool
- func (p *Parser) Graph() *Graph
- func (p *Parser) Handler() *SimpleEventHandler
- func (p *Parser) Inc()
- func (p *Parser) Index() bool
- func (p *Parser) Ogdl()
- func (p *Parser) OgdlTypes()
- func (p *Parser) Path() bool
- func (p *Parser) Selector() bool
- func (p *Parser) Template()
- func (p *Parser) Text() bool
- func (p *Parser) UnaryExpression() bool
- func (p *Parser) Variable() bool
- type SimpleEventHandler
- func (e *SimpleEventHandler) Add(s string)
- func (e *SimpleEventHandler) AddAt(s string, lv int)
- func (e *SimpleEventHandler) AddBytes(b []byte)
- func (e *SimpleEventHandler) AddBytesAt(b []byte, lv int)
- func (e *SimpleEventHandler) AddItf(i interface{})
- func (e *SimpleEventHandler) Dec()
- func (e *SimpleEventHandler) Delete()
- func (e *SimpleEventHandler) Inc()
- func (e *SimpleEventHandler) Level() int
- func (e *SimpleEventHandler) SetLevel(l int)
- func (e *SimpleEventHandler) Tree() *Graph
Examples ¶
Constants ¶
const ( TypeExpression = "!e" TypePath = "!p" TypeVariable = "!v" TypeSelector = "!s" TypeIndex = "!i" TypeGroup = "!g" TypeArguments = "!a" TypeTemplate = "!t" TypeString = "!string" TypeIf = "!if" TypeEnd = "!end" TypeElse = "!else" TypeElseIf = "!elseif" TypeFor = "!for" TypeBreak = "!break" )
Nodes containing these strings are special
Variables ¶
var ( // ErrInvalidUnread reports an unsuccessful UnreadByte or UnreadRune ErrInvalidUnread = errors.New("invalid use of UnreadByte or UnreadRune") // ErrEOS indicates the end of the stream ErrEOS = errors.New("EOS") // ErrSpaceNotUniform indicates mixed use of spaces and tabs for indentation ErrSpaceNotUniform = errors.New("space has both tabs and spaces") // ErrUnterminatedQuotedString is obvious. ErrUnterminatedQuotedString = errors.New("quoted string not terminated") ErrNotANumber = errors.New("not a number") ErrNotFound = errors.New("not found") ErrIncompatibleType = errors.New("incompatible type") ErrNilReceiver = errors.New("nil function receiver") ErrInvalidIndex = errors.New("invalid index") ErrFunctionNoGraph = errors.New("functions doesn't return *Graph") ErrInvalidArgs = errors.New("invalid arguments or nil receiver") )
Functions ¶
func IsBreakChar ¶
IsBreakChar returns true for 10 and 13 (newline and carriage return)
func IsEndChar ¶
IsEndChar returns true for all integers < 32 that are not newline, carriage return or tab.
func IsEndRune ¶ added in v1.2.0
IsEndRune returns true for all integers < 32 that are not newline, carriage return or tab.
func IsTextChar ¶
IsTextChar returns true for all integers > 32 and are not OGDL separators (parenthesis and comma)
Types ¶
type Graph ¶
type Graph struct { This interface{} Out []*Graph }
Graph is a node with outgoing pointers to other Graph objects. It is implemented as a named list.
func FromBinary ¶ added in v1.1.0
FromBinary converts an OGDL binary stream of bytes into a Graph.
func FromBinaryFile ¶ added in v1.1.0
FromBinaryFile converts an OGDL binary stream of bytes into a Graph.
func FromBinaryReader ¶ added in v1.1.0
FromBinaryReader converts an OGDL binary stream of bytes into a Graph.
func FromBytes ¶ added in v1.1.0
FromBytes parses OGDL text contained in a byte array. It returns a *Graph
func FromJSON ¶ added in v1.1.0
FromJSON converts a JSON text stream into OGDL.
Json types returned by Decode/Unmarshall: - bool, for JSON booleans - int64 / float64, for JSON numbers - string, for JSON strings - []interface{}, for JSON arrays - map[string]interface{}, for JSON objects - nil for JSON null
TODO I'm not sure about not giving lists a root node, but we need to avoid both useless nesting and also post-simplification (and its unwanted side effects). But, for example [ "a", [ "b", "c" ] ] will be returned as:
a b c
func FromReader ¶ added in v1.1.0
FromReader parses OGDL text coming from a generic io.Reader
func FromString ¶ added in v1.1.0
FromString parses OGDL text from the given string. It returns a *Graph
func FromStringTypes ¶ added in v1.2.0
FromStringTypes parses OGDL text from the given string. It returns a *Graph. Basic types found in the string are converted to their correspongind Go types (either string | int64 | float64 | bool).
func New ¶ added in v1.1.0
func New(n interface{}) *Graph
New returns a pointer to Graph initialized to the object given.
func NewExpression ¶
NewExpression parses an expression in text format (given in the string) to a Graph, in the form of a suitable syntax tree.
expression := expr1 (op2 expr1)* expr1 := path | constant | op1 path | op1 constant | '(' expr ')' | op1 '(' expr ')' constant ::= quoted | number
func NewPath ¶
NewPath takes a Unicode string representing an OGDL path, parses it and returns it as a Graph object.
It also parses extended paths, as those used in templates, which may have argument lists.
func NewTemplate ¶
NewTemplate parses a text template given as a string and converts it to a Graph. Templates have fixed and variable parts. Variables all begin with '$'.
A template is a text file in any format: plain text, HTML, XML, OGDL or whatever. The dolar sign acts as an escape character that switches from the text to the variable plane. Parsed templates are converted back to text by evaluating the variable parts against a Graph object, by means of the Process() method.
Template grammar
template ::= ( text | variable )* variable ::= ('$' path) | ('$' '(' expression ')') | ('$' '{' expression '}') path ::= as defined in path.go expression ::= as defined in expression.go
Some variables act as directives: $if, $else, $end, $for, $break.
$if(expression) $else $end $for(destPath,sourcepath) $break $end
Example ¶
p := NewTemplate("Hello, $user") g := New("_") g.Add("user").Add("Jenny") fmt.Println(string(p.Process(g)))
Output: Hello, Jenny
func NewTemplateFromBytes ¶ added in v1.1.0
NewTemplateFromBytes has the same function as NewTemplate except that the input stream is a byte array.
func (*Graph) Bool ¶
Bool returns the node as a boolean. If the node is not a boolean, it returns false, or the default value if given.
func (*Graph) Check ¶
Check returns true if the Graph given as a parameter conforms to the schema represented by the receiver Graph.
Example ¶
schema := FromString("a !int\nb !string\nc !float\nd !bool") g := FromString("a 1\nb s\nc 1.0\nd true") b, message := schema.Check(g) fmt.Println(b, message)
Output: true
func (*Graph) Clone ¶ added in v1.1.0
Clone returns a copy of the current graph.
Warning (from the Go faq): Copying an interface value makes a copy of the thing stored in the interface value. If the interface value holds a struct, copying the interface value makes a copy of the struct. If the interface value holds a pointer, copying the interface value makes a copy of the pointer, but not the data it points to.
func (*Graph) Copy ¶
Copy adds a copy of the graph given to the current graph.
Warning (from the Go faq): Copying an interface value makes a copy of the thing stored in the interface value. If the interface value holds a struct, copying the interface value makes a copy of the struct. If the interface value holds a pointer, copying the interface value makes a copy of the pointer, but not the data it points to.
func (*Graph) Create ¶ added in v1.1.0
Create returns the first subnode whose string value is equal to the given string, with its subnodes deleted. If not found, the node is created and returned.
func (*Graph) Delete ¶
func (g *Graph) Delete(n interface{})
Delete removes all subnodes with the given content
func (*Graph) Equals ¶ added in v1.1.0
Equals returns true if the given graph and the receiver graph are equal.
func (*Graph) Eval ¶
Eval takes a parsed expression and evaluates it in the context of the current graph.
func (*Graph) Find ¶ added in v1.1.0
Find returns a Graph with all subnodes that match the regular expression given. It only walks through the subnodes of the current Graph. If the regex doesn't compile, an error will be returned. If the result set is empty, both return values are nil (no error is signaled).
func (*Graph) Float64 ¶
Float64 returns the node as a float64. If the node is not a number, it return NaN, or the default value if given.
func (*Graph) Get ¶
Get recurses a Graph following a given path and returns the result.
This function returns a *Graph in any condition. When there is nothing to return, a nil Graph is returned. This behavior is designed so that the next function in a chain never gets an invalid receiver, avoiding null pointer errors.
OGDL Path: elements are separated by '.' or [] or {} index := [N] selector := {N} tokens can be quoted
func (*Graph) GetBool ¶
GetBool returns the result of applying a path to the given Graph. The result is returned as a bool. If the path result cannot be converted to a boolean, then an error is returned.
func (*Graph) GetBytes ¶
GetBytes returns the result of applying a path to the given Graph. The result is returned as a byte slice.
func (*Graph) GetFloat64 ¶
GetFloat64 returns the result of applying a path to the given Graph. The result is returned as a float64. If the path result cannot be converted to a float, then an error is returned.
func (*Graph) GetInt64 ¶
GetInt64 returns the result of applying a path to the given Graph. The result is returned as an int64. If the path result cannot be converted to an integer, then an error is returned.
func (*Graph) GetString ¶
GetString returns the result of applying a path to the given Graph. The result is returned as a string. If the error information is not used, then this method is equivalent to Get(path).String()
func (*Graph) Int64 ¶
Int64 returns the node as an int64. If the node is not a number, it returns 0, or the default value if given.
func (*Graph) Interface ¶ added in v1.1.0
func (g *Graph) Interface() interface{}
Interface returns the first child of this node as an interface
func (*Graph) JSON ¶ added in v1.2.0
JSON produces JSON text from a Graph
JSON has maps (objects, {}), lists (arrays, []) and values.
Values can be strings, numbers, maps, lists, 'true', 'false' or 'null'
map ::= '{' string ':' value [',' string : value]* '}' list ::= '[' value [',' value]* ']'
By definition, since maps and lists cannot be distinguished in OGDL, any list should have a '_' root node. Any non-leaf node is a map (unless is contains '_', obviously).
func (*Graph) Node ¶
Node returns the first subnode whose string value is equal to the given string. It returns nil if not found.
func (*Graph) NodeOrNew ¶ added in v1.2.0
NodeOrNew returns the first subnode whose string value is equal to the given string. It creates the node if not found.
func (*Graph) Number ¶
func (g *Graph) Number() interface{}
Number returns either a float64, int64 or nil
func (*Graph) Process ¶
Process processes the parsed template, returning the resulting text in a byte array. The variable parts are resolved out of the Graph given.
Example (For) ¶
g := FromString("spaces\n cvm\n req\n stkreq\n sysreq\n design\n hardware") t := NewTemplate("$spaces\n$for(s,spaces)$s._string\n$for(d,s[0])- $d\n$end$end") s := t.Process(g) fmt.Println(string(s))
Output: cvm req stkreq sysreq design hardware cvm req - stkreq - sysreq design - hardware
func (*Graph) Scalar ¶
func (g *Graph) Scalar() interface{}
Scalar returns the current node content, reducing the number of types following these rules:
uint* -> int64 int* -> int64 float* -> float64 byte -> int64 rune -> int64 bool -> bool string, []byte: if it represents an int or float or bool, convert to int64, float64 or bool
Any other type is returned as is.
func (*Graph) Set ¶
Set sets the first occurrence of the given path to the value given.
Example ¶
g := FromString("a b c") g.Set("a.b", "d") fmt.Println(g.Text())
Output: a b d
Example (A) ¶
g := New(nil) g.Add("R").Add("b") r := g.Node("R") r.Set("id", "1") fmt.Println(g.Text())
Output: R b id 1
Example (Index) ¶
g := FromString("a b c") g.Set("a[1]", "d") fmt.Println(g.Text())
Output: a b c d
func (*Graph) SortAsString ¶ added in v1.2.0
func (*Graph) String ¶
String returns a string representation of this node, or an empty string. This function doesn't return an error, because it is mostly used in single variable return situations. String accepts one default value, which will be returned instead of an empty string.
func (*Graph) StringCSV ¶ added in v1.2.0
StringCSV returns a comma separated value representation of all direct subnodes. StringCSV accepts one default value, which will be returned instead of an empty string.
func (*Graph) StringTxt ¶ added in v1.2.0
StringTxt returns a space separated value representation of all direct subnodes. StringTxt accepts one default value, which will be returned instead of an empty string.
func (*Graph) Strings ¶ added in v1.2.0
StringCSV returns a comma separated value representation of all direct subnodes. StringCSV accepts one default value, which will be returned instead of an empty string.
func (*Graph) Substitute ¶
Substitute traverses the graph substituting all nodes with content equal to s by v.
func (*Graph) Text ¶
Text is the OGDL text emitter. It converts a Graph into OGDL text.
Strings are quoted if they contain spaces, newlines or special characters. Null elements are not printed, and act as transparent nodes.
func (*Graph) ThisBytes ¶ added in v1.1.0
ThisBytes returns the node as []byte, or nil if not possble.
func (*Graph) ThisFloat64 ¶ added in v1.2.0
ThisFloat64 returns a float64
func (*Graph) ThisNumber ¶ added in v1.1.0
func (g *Graph) ThisNumber() interface{}
ThisNumber returns either a float64, int64 or nil
func (*Graph) ThisScalar ¶ added in v1.1.0
func (g *Graph) ThisScalar() interface{}
ThisScalar returns this node's content as an interface
func (*Graph) ThisString ¶ added in v1.1.0
ThisString returns the current node content as a string
func (*Graph) ThisType ¶ added in v1.1.0
ThisType returns the name of the native type contained in the current node.
type Lexer ¶ added in v1.2.0
type Lexer struct {
// contains filtered or unexported fields
}
Lexer implements buffering for an io.Reader object, with multiple byte unread operations allowed.
func (*Lexer) Byte ¶ added in v1.2.0
Byte reads and returns a single byte. If no byte is available, returns 0 and an error.
func (*Lexer) Integer ¶ added in v1.2.0
Integer returns true if it finds an (unsigned) integer at the current parser position. It returns also the number found.
func (*Lexer) Number ¶ added in v1.2.0
Number returns true if it finds a number at the current parser position. It returns also the number found. TODO recognize exp notation ?
func (*Lexer) Operator ¶ added in v1.2.0
Operator returns true if it finds an operator at the current parser position It returns also the operator found.
func (*Lexer) Quoted ¶ added in v1.2.0
Quoted string. Can have newlines in it. It returns the string if any, a bool indicating if a quoted string was found, and a possible error.
func (*Lexer) Rune ¶ added in v1.2.0
Rune reads a single UTF-8 encoded Unicode character and returns the rune. If the encoded rune is invalid, it consumes one byte and returns unicode.ReplacementChar (U+FFFD) with a size of 1.
func (*Lexer) ScalarType ¶ added in v1.2.0
ScalarType ::= string | int64 | float64 | bool
func (*Lexer) Space ¶ added in v1.2.0
Space is (0x20|0x09)+. It returns a boolean indicating if space has been found, and an integer indicating how many spaces, iff uniform (either all 0x20 or 0x09)
func (*Lexer) StringStop ¶ added in v1.2.0
StringStop is a concatenation of text bytes that are not in the parameter stopBytes
func (*Lexer) TemplateText ¶ added in v1.2.0
TemplateText parses text in a template.
func (*Lexer) Token8 ¶ added in v1.2.0
Token8 reads from the Parser input stream and returns a token, if any. A token is defined as a sequence of Unicode letters and/or numbers and/or _.
func (*Lexer) UnreadByte ¶ added in v1.2.0
func (p *Lexer) UnreadByte()
UnreadByte unreads the last byte. It can unread all buffered bytes.
func (*Lexer) UnreadRune ¶ added in v1.2.0
UnreadRune unreads the last rune.
func (*Lexer) WhiteSpace ¶ added in v1.2.0
WhiteSpace is equivalent to Space | Break. It consumes all white space, whether spaces, tabs or newlines
type Log ¶
type Log struct {
// contains filtered or unexported fields
}
Log is a log store for binary OGDL objects.
All objects are appended to a file, and a position is returned.
func (*Log) Add ¶
Add adds an OGDL object to the log. The starting position into the log is returned.
func (*Log) AddBinary ¶
AddBinary adds an OGDL binary object to the log. The starting position into the log is returned.
func (*Log) Bytes ¶ added in v1.2.0
Bytes works only if we have been writing to the byte buffer, not to a file
func (*Log) Get ¶
Get returns the OGDL object at the position given and the position of the next object, or an error.
func (*Log) GetBinary ¶
GetBinary returns the OGDL object at the position given and the position of the next object, or an error. The object returned is in binary form, exactly as it is stored in the log.
type Parser ¶
type Parser struct { Lexer // Buffered byte and rune readed // contains filtered or unexported fields }
Parser embeds Lexer and holds some state
func NewBytesParser ¶
NewBytesParser returns a new Parser from a byte array
func NewStringParser ¶
NewStringParser returns a new Parser from a string
func (*Parser) ArgList ¶
ArgList ::= space? expression space? [, space? expression]* space?
arglist < stream > events
arglist can be empty, then returning false (this fact is not represented in the BNF definition).
func (*Parser) Emit ¶
Emit outputs a string event at the current level. This will show up in the graph
func (*Parser) Handler ¶ added in v1.2.0
func (p *Parser) Handler() *SimpleEventHandler
Handler returns the event handler being used
func (*Parser) Ogdl ¶
func (p *Parser) Ogdl()
Ogdl is the main function for parsing OGDL text.
An OGDL stream is a sequence of lines (a block of text or a quoted string can span multiple lines but is still parsed by Line())
Graph ::= Line* End
func (*Parser) OgdlTypes ¶ added in v1.2.0
func (p *Parser) OgdlTypes()
OgdlTypes is the main function for parsing OGDL text.
This version tries to convert unquoted strings that can be parsed as ints, floats or bools to their corresponding type in Go (string | int64 | float64 | bool).
func (*Parser) Path ¶
Path parses an OGDL path, or an extended path as used in templates.
path ::= element ('.' element)* element ::= token | integer | quoted | group | index | selector (Dot optional before Group, Index, Selector) group := '(' Expression [[,] Expression]* ')' index := '[' Expression ']' selector := '{' Expression '}'
The OGDL parser doesn't need to know about Unicode. The character classification relies on values < 127, thus in the ASCII range, which is also part of Unicode.
Note: On the other hand it would be stupid not to recognize for example Unicode quotation marks if we know that we have UTF-8. But when do we know for sure?
func (*Parser) UnaryExpression ¶
UnaryExpression := cpath | constant | op1 cpath | op1 constant | '(' expr ')' | op1 '(' expr ')'
type SimpleEventHandler ¶ added in v1.2.0
type SimpleEventHandler struct {
// contains filtered or unexported fields
}
SimpleEventHandler receives events and produces a tree.
func (*SimpleEventHandler) Add ¶ added in v1.2.0
func (e *SimpleEventHandler) Add(s string)
Add creates a string node at the current level.
func (*SimpleEventHandler) AddAt ¶ added in v1.2.0
func (e *SimpleEventHandler) AddAt(s string, lv int)
AddAt creates a string node at the specified level.
func (*SimpleEventHandler) AddBytes ¶ added in v1.2.0
func (e *SimpleEventHandler) AddBytes(b []byte)
AddBytes creates a byte array node at the current level
func (*SimpleEventHandler) AddBytesAt ¶ added in v1.2.0
func (e *SimpleEventHandler) AddBytesAt(b []byte, lv int)
AddBytesAt creates a byte array node at the specified level
func (*SimpleEventHandler) AddItf ¶ added in v1.2.0
func (e *SimpleEventHandler) AddItf(i interface{})
AddItf creates a string node at the current level.
func (*SimpleEventHandler) Dec ¶ added in v1.2.0
func (e *SimpleEventHandler) Dec()
Dec decrements the current level by 1.
func (*SimpleEventHandler) Delete ¶ added in v1.2.0
func (e *SimpleEventHandler) Delete()
Delete removes the last node added
func (*SimpleEventHandler) Inc ¶ added in v1.2.0
func (e *SimpleEventHandler) Inc()
Inc increments the current level by 1.
func (*SimpleEventHandler) Level ¶ added in v1.2.0
func (e *SimpleEventHandler) Level() int
Level returns the current level
func (*SimpleEventHandler) SetLevel ¶ added in v1.2.0
func (e *SimpleEventHandler) SetLevel(l int)
SetLevel sets the current level
func (*SimpleEventHandler) Tree ¶ added in v1.2.0
func (e *SimpleEventHandler) Tree() *Graph
Tree returns the Graph object built from the events sent to this event handler.