*libecoli*.
- utilities: logging, string, strings vector, hash table, ...
-The grammar tree
-----------------
+The grammar graph
+-----------------
-The *ecoli nodes* are organized in a tree. An *ecoli grammar tree*
+The *ecoli nodes* are organized in a graph. Actually, it is mostly a
+tree, but loops are allowed in some cases. An *ecoli grammar tree*
describes how the input is parsed and completed. Let's take a simple
example:
.. figure:: simple-tree.svg
- A simple *ecoli grammar tree*.
+ A simple *ecoli grammar graph*.
We can also represent it as text like this::
When the *libecoli* parses an input, it browses the tree (depth first
search) and returns an *ecoli parse tree*. Let's decompose what is done
-when ``ec_node_parse_strvec(root_node, input)`` is called, step by step:
+when ``ec_parse_strvec(root_node, input)`` is called, step by step:
1. The initial input is a string vector ``["foo bar"]``.
2. The *sh_lex* node splits the input as a shell would have done it, in
.. figure:: simple-tree2.svg
- Another simple *ecoli grammar tree*.
+ Another simple *ecoli grammar graph*.
In that case, there is no lexer (the *sh_lex* node), so the input must
be a string vector that is already split. For instance, it matches:
- ``[]`` (empty vector)
At the time the input is parsed, a *parse tree* is built. When it
-matches, it describes which part of the *ecoli grammar tree* that
+matches, it describes which part of the *ecoli grammar graph* that
actually matched, and what input matched for each node.
Passing ``["bar", "1"]`` to the previous tree would result in the
The *ecoli parse tree*, result of parsing.
-Each node of the *parse tree* references the node of the *grammar tree*
+Each node of the *parse tree* references the node of the *grammar graph*
that matched. It also stores the string vector that matched.
.. figure:: parse-tree2.svg
.. figure:: simple-tree3.svg
- A simple *ecoli grammar tree*, that matches ``[]``, ``[foo]``,
+ A simple *ecoli grammar graph*, that matches ``[]``, ``[foo]``,
``[foo, foo]``, ...
Here is the resulting *parse tree* when the input vector is ``[foo, foo,
- params are consumed
- nodes
- attributes
+- extending lib with external nodes (in dev guide?)