Create parse tree from string input and grammar graph. More...
Macros | |
#define | EC_PARSE_NOMATCH INT_MAX |
#define | EC_PNODE_GET_ROOT(parse) |
#define | EC_PNODE_FOREACH_CHILD(child, pnode) |
#define | EC_PNODE_ITER_NEXT(root, parse, iter_children) |
Functions | |
struct ec_pnode * | ec_pnode (const struct ec_node *node) |
void | ec_pnode_free (struct ec_pnode *pnode) |
void | ec_pnode_free_children (struct ec_pnode *pnode) |
struct ec_pnode * | ec_pnode_dup (const struct ec_pnode *pnode) |
const struct ec_strvec * | ec_pnode_get_strvec (const struct ec_pnode *pnode) |
struct ec_pnode * | ec_parse (const struct ec_node *node, const char *str) |
struct ec_pnode * | ec_parse_strvec (const struct ec_node *node, const struct ec_strvec *strvec) |
int | ec_parse_child (const struct ec_node *node, struct ec_pnode *pstate, const struct ec_strvec *strvec) |
void | ec_pnode_link_child (struct ec_pnode *pnode, struct ec_pnode *child) |
void | ec_pnode_unlink_child (struct ec_pnode *child) |
struct ec_pnode * | ec_pnode_get_root (struct ec_pnode *pnode) |
struct ec_pnode * | ec_pnode_get_parent (const struct ec_pnode *pnode) |
struct ec_pnode * | ec_pnode_get_first_child (const struct ec_pnode *pnode) |
struct ec_pnode * | ec_pnode_get_last_child (const struct ec_pnode *pnode) |
struct ec_pnode * | ec_pnode_next (const struct ec_pnode *pnode) |
const struct ec_node * | ec_pnode_get_node (const struct ec_pnode *pnode) |
void | ec_pnode_del_last_child (struct ec_pnode *pnode) |
struct ec_dict * | ec_pnode_get_attrs (struct ec_pnode *pnode) |
void | ec_pnode_dump (FILE *out, const struct ec_pnode *pnode) |
const struct ec_pnode * | ec_pnode_find (const struct ec_pnode *root, const char *id) |
const struct ec_pnode * | ec_pnode_find_next (const struct ec_pnode *root, const struct ec_pnode *prev, const char *id, bool iter_children) |
size_t | ec_pnode_len (const struct ec_pnode *pnode) |
size_t | ec_pnode_matches (const struct ec_pnode *pnode) |
Create parse tree from string input and grammar graph.
Node parse API.
The parse operation is to check if an input (a string or vector of strings) matches the node tree. On success, the result is stored in a tree that describes which part of the input matches which node.
The parsing tree is sometimes referenced by another node than the root node. Use ec_pnode_get_root() to get the root node in that case.
#define EC_PARSE_NOMATCH INT_MAX |
Return value of ec_parse_child() when input does not match grammar.
Definition at line 147 of file ecoli_parse.h.
#define EC_PNODE_GET_ROOT | ( | parse | ) |
Get the root of the parsing tree.
Get the root of the parsing tree, keeping the const statement if the argument has it.
parse | A node in the parsing tree. |
Definition at line 211 of file ecoli_parse.h.
#define EC_PNODE_FOREACH_CHILD | ( | child, | |
pnode ) |
Iterate the children of a node.
child | The item that will be set at each iteration. |
pnode | The parent node in the parsing tree. |
Definition at line 284 of file ecoli_parse.h.
#define EC_PNODE_ITER_NEXT | ( | root, | |
parse, | |||
iter_children ) |
Definition at line 386 of file ecoli_parse.h.
struct ec_pnode * ec_pnode | ( | const struct ec_node * | node | ) |
Create an empty parsing tree.
This function is used internally when parsing an input using a grammar tree.
node | The grammar node. |
void ec_pnode_free | ( | struct ec_pnode * | pnode | ) |
Free a parsing tree.
pnode | The root of the parsing tree to be freed. It must not have any parent. |
void ec_pnode_free_children | ( | struct ec_pnode * | pnode | ) |
Remove and free all the children of a parsing tree node.
pnode | Node whose children will be freed. |
Duplicate a parsing tree.
pnode | A node inside a parsing tree. |
Get the string vector associated to a parsing node.
When an input is parsed successfully (i.e. the input string vector matches the grammar tree), the matching string vector is copied inside the associated parsing node.
For instance, parsing the input ["foo", "bar"] on a grammar which is a sequence of strings, the attached string vector will be ["foo", "bar"] on the root pnode, ["foo"] on the first leaf, and ["bar"] on the second leaf.
If the parsing tree does not match (see ec_pnode_matches()), it the associated string vector is NULL.
pnode | The parsing node. If NULL, the function returns NULL. |
Parse a string using a grammar tree.
This is equivalent to calling ec_parse_strvec() on the same node, with a string vector containing only the argument string str.
node | The grammar node. |
str | The input string. |
Parse a string vector using a grammar tree.
Generate a parsing tree by parsing the input string vector using the given grammar tree.
The parsing tree is composed of struct ec_pnode, and each of them is associated to a struct ec_node (the grammar node), to the string vector that matched the subtree, and to optional attributes.
When the input matches the grammar tree, the string vector associated to the root node of the returned parsing tree is the same than the strvec argument. Calling ec_pnode_matches() on this tree returns true.
If the input does not match the grammar tree, the returned parsing tree only contains one root node, with no associated string vector. Calling ec_pnode_matches() on this tree returns false.
node | The grammar node. |
strvec | The input string vector. |
int ec_parse_child | ( | const struct ec_node * | node, |
struct ec_pnode * | pstate, | ||
const struct ec_strvec * | strvec ) |
Parse a string vector using a grammar tree, from a parent node.
This function is usually called from an intermediate node (like ec_node_seq, ec_node_or, ...) to backfill the parsing tree, which is built piece by piece while browsing the grammar tree.
ec_parse_child() creates a new child in this parsing tree, and calls the parse() method for the child node, with pstate pointing to this new child. If it does not match, the child is removed in the state, else it is kept, with its possible descendants.
node | The grammar node. |
pstate | The node of the parsing tree. |
strvec | The input string vector. |
Link a parsing node to a parsing tree.
Add a child to a node in a parsing tree, at the end of the children list.
pnode | The node of the parsing tree where the child is added. |
child | The node (or subtree) to add in the children list. |
void ec_pnode_unlink_child | ( | struct ec_pnode * | child | ) |
Remove a child node from parsing tree.
Remove a child node (and its children) from the children list its parent node in the parsing tree. The child node is not freed.
child | The node (or subtree) to remove. |
Get the root of the parsing tree.
You may also use EC_PNODE_GET_ROOT() instead, that keeps the const statement.
pnode | A node in the parsing tree. |
Get the parent node in the parsing tree.
pnode | A node in the parsing tree. |
Get the first child of a node in the parsing tree.
pnode | A node in the parsing tree. |
Get the last child of a node in the parsing tree.
pnode | A node in the parsing tree. |
Get the next sibling node.
If pnode is the root of the parsing tree, return NULL. Else return the next sibling node.
pnode | A node in the parsing tree.. |
Get the grammar node corresponding to the parsing node.
pnode | A node in the parsing tree. |
void ec_pnode_del_last_child | ( | struct ec_pnode * | pnode | ) |
Unlink and free the last child.
Shortcut to unlink and free the last child of a node. It is a quite common operation in intermediate nodes (like ec_node_seq, ec_node_many, ...) to remove a subtree that was temporarily added when during the completion process.
pnode | A node in the parsing tree which has at least one child. |
Get attributes associated to a node in a parsing tree.
Attributes are key/values that are stored in a dictionary and attached to a node in the parsing tree. An attribute can be added to a node by the parsing or completion method of an ec_node.
pnode | A node in the parsing tree. |
void ec_pnode_dump | ( | FILE * | out, |
const struct ec_pnode * | pnode ) |
Dump a parsing tree.
out | The stream where the dump is done. |
pnode | The parsing tree to dump. |
Find a node from its identifier.
Find the first node in the parsing tree which has the given node identifier. The search is a depth-first search.
root | The node of the parsing tree where the search starts. |
id | The node identifier string to match. |
const struct ec_pnode * ec_pnode_find_next | ( | const struct ec_pnode * | root, |
const struct ec_pnode * | prev, | ||
const char * | id, | ||
bool | iter_children ) |
Find the next node matching an identifier.
After a succesful call to ec_pnode_find() or ec_pnode_find_next(), it is possible to get the next node that has the specified id. There are 2 options:
root | The root of the search, as passed to ec_pnode_find(). |
prev | The node returned by the previous search. |
id | The node identifier string to match. |
iter_children | True to iterate the children of "prev", false to skip them. |
size_t ec_pnode_len | ( | const struct ec_pnode * | pnode | ) |
Get the total number of elements in a parse node.
size_t ec_pnode_matches | ( | const struct ec_pnode * | pnode | ) |
Get the number of matches.