*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::
.. 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?)
doc_install_dir = join_paths('share', 'doc', 'libecoli')
-doxygen = find_program('doxygen', required : false)
-if not doxygen.found()
- error('MESON_SKIP_TEST doxygen not found.')
-endif
-
cdata = configuration_data()
cdata.set('VERSION', meson.project_version())
cdata.set('OUTPUT', join_paths(meson.build_root(), 'doc', 'api'))
cdata.set('TOPDIR', meson.source_root())
-doxygen_conf = configure_file(
- input: 'Doxyfile.in',
- output: 'Doxyfile',
- configuration: cdata,
- install: false)
-
-doxygen_build = custom_target(
- 'doxygen',
- input: doxygen_conf,
- output: 'api',
- command: [doxygen, '@INPUT@', '@OUTPUT@'],
- build_by_default: true,
- install_dir: doc_install_dir)
+doxygen = find_program('doxygen',
+ required : get_option('build_doc'))
sphinx_build = find_program(
'sphinx-build', required: get_option('build_doc'))
-if get_option('build_doc') and sphinx_build.found()
+
+if get_option('build_doc')
+ doxygen_conf = configure_file(
+ input: 'Doxyfile.in',
+ output: 'Doxyfile',
+ configuration: cdata,
+ install: false)
+
+ doxygen_build = custom_target(
+ 'doxygen',
+ input: doxygen_conf,
+ output: 'api',
+ command: [doxygen, '@INPUT@', '@OUTPUT@'],
+ build_by_default: true,
+ install_dir: doc_install_dir)
+
html_doc = custom_target('html_doc',
input: meson.current_source_dir(),
output: 'html_doc',