From 6d5a8e1dcadb528a36716ff3d34d704f43aad0ae Mon Sep 17 00:00:00 2001 From: Florian Schanda Date: Tue, 18 Jul 2023 15:13:16 +0200 Subject: [PATCH] Re-generate documentation for release. --- docs/.buildinfo | 2 +- docs/.doctrees/environment.pickle | Bin 594644 -> 657165 bytes docs/.doctrees/manual/ast.doctree | Bin 325983 -> 364130 bytes docs/.doctrees/manual/errors.doctree | Bin 37425 -> 38399 bytes docs/.doctrees/manual/infrastructure.doctree | Bin 19932 -> 20858 bytes docs/_static/documentation_options.js | 2 +- docs/architecture.md | 1119 ----------------- docs/bmw_favicon.ico | Bin 5430 -> 0 bytes docs/genindex.html | 40 +- docs/index.html | 6 +- docs/knowledge_accumulation.dot | 18 - docs/knowledge_accumulation.svg | 103 -- docs/lrm-2.8.html | 377 +++--- docs/manual/ast.html | 226 +++- docs/manual/errors.html | 14 +- docs/manual/infrastructure.html | 8 +- docs/objects.inv | Bin 926 -> 983 bytes docs/search.html | 6 +- docs/searchindex.js | 2 +- docs/vcg-example/potato.rsl | 11 - docs/vcg-example/trlc-Potato-Kitten.svg | 280 ----- docs/vcg-example/trlc-Potato-Kitten_0000.smt2 | 29 - docs/vcg-example/trlc-Potato-Kitten_0001.smt2 | 45 - docs/vcg-example/trlc-Potato-Kitten_0002.smt2 | 34 - docs/vcg-example/trlc-Potato-Kitten_0003.smt2 | 29 - docs/vcg-example/trlc-Potato-Kitten_0004.smt2 | 28 - docs/vcg-example/trlc-Potato-Kitten_0005.smt2 | 27 - docs/vcg-example/trlc-Potato-Kitten_0006.smt2 | 23 - 28 files changed, 473 insertions(+), 1956 deletions(-) delete mode 100644 docs/architecture.md delete mode 100644 docs/bmw_favicon.ico delete mode 100644 docs/knowledge_accumulation.dot delete mode 100644 docs/knowledge_accumulation.svg delete mode 100644 docs/vcg-example/potato.rsl delete mode 100644 docs/vcg-example/trlc-Potato-Kitten.svg delete mode 100644 docs/vcg-example/trlc-Potato-Kitten_0000.smt2 delete mode 100644 docs/vcg-example/trlc-Potato-Kitten_0001.smt2 delete mode 100644 docs/vcg-example/trlc-Potato-Kitten_0002.smt2 delete mode 100644 docs/vcg-example/trlc-Potato-Kitten_0003.smt2 delete mode 100644 docs/vcg-example/trlc-Potato-Kitten_0004.smt2 delete mode 100644 docs/vcg-example/trlc-Potato-Kitten_0005.smt2 delete mode 100644 docs/vcg-example/trlc-Potato-Kitten_0006.smt2 diff --git a/docs/.buildinfo b/docs/.buildinfo index 88cf400d..71b5f10a 100644 --- a/docs/.buildinfo +++ b/docs/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 111e85c97fd3a6010d134b07b951e6d5 +config: 6a283bd8d65c6e949d14112750e7e111 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/.doctrees/environment.pickle b/docs/.doctrees/environment.pickle index c5bd54a2224be8b7da895126648fea413f29f229..c29d2539b9dc5630df08f2a15c4a4f93ae2b73c7 100644 GIT binary patch delta 94271 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 delta 70114 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 diff --git a/docs/.doctrees/manual/ast.doctree b/docs/.doctrees/manual/ast.doctree index 2101bcf57802e3218e1f3e95fd7547ef53711a96..03bd84f00fabcb84de016cef4961ae6d39e83c73 100644 GIT binary patch delta 58018 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 A1ONa4 delta 39390 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 Oo;9($&bCG$r~Dr^Q<&la diff --git a/docs/.doctrees/manual/errors.doctree b/docs/.doctrees/manual/errors.doctree index 623d2f4e6f42904a6eb12287c923369803f3ce8e..b61bb33e8d92146be544d13aa70c8e88448fd542 100644 GIT binary patch delta 5849 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 Y&(w2cfyO_o+e$f-$5b_RX78Qs|JfOL7XSbN delta 5508 zcmai2d32Q373aO#H!@_BkQlOuOeUF`1VV&hHX@4z>GXd_Z?7HZ#K4*4DD7zP+t6xv{0Cxh3E?)CT-9{Shkm52($;e?_gdz$RMRpS|CL}>;sns^jUb?}7 zIUW2A2j5mVlsOamJ`L16%WOAjg^A_NA1|H7l{ifjegf-=ca&0WRNU*=+838=c=F{T@`MO>e+bpjaOZ}S)}_!8ZwC@liVOLi?(Kc}})GCsT_@l?VrB7NqCkh;)IC8M9ML#$Rb4!b>UG^Y^s-v;DUT z5pul(@IYQFvxDREE}zBK(a^7#kH~76~&ZdrZnjh|r0P5Wc}tx=}C0H-axB6JKoh-MNSwneVL-UsLEt zKvz_%NiW|IjVv#%weTAn6gcq~UDd#cQ|GWHL=BpE8%&Fk1iF>Dw&oEwVE$bX zGB$(@5kZ%~tAi_rm)O5?Kn|s!5{WE+UME8A525kfp>d3qe7qifX?fhCr})Yz>VZWj z00meFyi$_G^W=fOk_QLsN}VFeBBZZ0%l0nquL$$fIh_cUCsBZb@{`hJwg|p0ont#k zQ{*^#3e7sxp=HJ_UQ3`kaCt@}tATsVR`V7lk(g&{){6r}Fkfr@c*%fU;OYu&4P^Rt zem!NQ%wR+)y?eTRnETyczK66!p{q|XLKim5mDRfG)GIt*{P727SXpld?DNPUg>?<$TT$sDm6b}I^8 zS5*YR5Cnx=y{xCWHSzlBL=lsSVnal+!NA2n5=2k`G|}#R<|+Q4VF=&MRD;+|Y=((a zz`9G!3hv}I=$e_Wkra|ehEaDD@rWcgNRp+(#(CBBfxfSamy!@I2{0K1UB5?9u5VOa ze><%L>LLxinZ}){(S$=;c$GHH@(7kvjhTfqMPK{^d~b73}p%uZrK-bg*%Lt6M0Xp)@BHeiKpPwToOZ8hSSQNK6f z|6FvaHncLkeO4%X8tyUnSC`WwgFs_LK~6ZsRhj*qni{CQhRd)q}Y5XRd z^3CB+lZc$@reVDCaA8LYFET;O&M8p$um|q!9~T?GM;M`$qO3q=&WN!2WR9gn<%+DJ zH5wMyvf${7sk~9PSRZCF28!yYvUX^%E94z2NHglT3ds6!NE%ia05aU(Ft{pykjUrr zauY^97d%=Y`4jw~RT;A&>Qlnl-f&|ytnlByG9Rw2DCEk%n;HuE1ry9{D1w2y$-!N> z;rw$11986W;3m+Z0O<)Tzuq_#-1Sp~B)EDvh^@T>|9LK`7`syIkSQ+WNeh=Ql z>eWwcJMk{Skp-FH^w+WbfUS}rQ47s@r1B%G3LjB3;e3@5;@A9&NjOE$@T<(?QS^`) zz?{u-;6S&>J` zj`Szl8aWbz2A?sPWor(L@iUSq;5zDBop8E&xm*);teMWfQ|4%cFPd-6B9mdG&Sa4m z%6Gv`76BLAMNNkd=ac0;<6JbPtf7I|TG0O~3DzKyEI!ww(t@_OY`#fW>ljvZ!hd#T z^T#a0XPg${Gsl-ljvtxwZbVLnA+L_@6gE1-Y=jC_+-)pS?Np%7r#+UdJi0HAT7Mc9 zVotRGa~YN7a)Nx5dLpBWo;pEdcBNocEG%HSgoqB0?Rixq#QZ(G9K%DuZe^3NwRNQQ zO=8*D2O(pkr#1$$3o7Bi9bfUw7Lkyz;g(@S#xG3BR!Yd1P@SlNuX72U-#DFN^}a0; z4lhiw21R&Q_(a-Ng!M3qaw>i#`q!q-%!MM6g84)%72zxePHZk?GeW~fVwk5`MQvUk z8ebe5r;HkI(kcq<^GFplYP1z;UXeCpBT-*uRO$pXs+K0mZhFxo-1O6}1$>)TWYwwL zTzK}rZAokw8ZPI(WE8I{X4HU{GO9%Yi;Nl#_jITDC2UfJ5E#*q}Qz?)lKit<)^LC)IEj$HB4P+dtGKsuKuCI2i@kl zRph-e;UBG(_t~INM#MDXGF!+MLsQ4^7rj=gMv!l`W&qNCn%hAFjPaQ1= zPwqLuS;?S(@247l9L4Q?Qbeaj diff --git a/docs/.doctrees/manual/infrastructure.doctree b/docs/.doctrees/manual/infrastructure.doctree index 1828b54ab3a124961de49202fd85cbcce12cf8e9..99753b56aae7ad8f4c6f52987423622f6c1a43eb 100644 GIT binary patch delta 4855 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 diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js index ddff33ba..c8b0f661 100644 --- a/docs/_static/documentation_options.js +++ b/docs/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.1.5', + VERSION: '1.1.6', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/architecture.md b/docs/architecture.md deleted file mode 100644 index 4a0a4492..00000000 --- a/docs/architecture.md +++ /dev/null @@ -1,1119 +0,0 @@ -# TRLC Architecture - -This document is a (somewhat minimal) documentation of how the tools -work and why certain design decisions were made. It is required -reading if you want to contribute to the code base or language design. - -It is assumed that the reader understand basic compiler design, if not -then the [dragon -book](https://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools) -is a good place to start. - -## Coding style - -Most of these are checked with `make lint`. Generally normal Python, -with some changes: - -* Class names follow Ada naming convention (e.g. LASER_Is_An_Acronym) -* Methods are lowercase with underscores (e.g. eat_potato) -* Just use simple `%` string formatting -* Horizontal alignment where reasonable, for example - - ```python - x = { - "potatos" : 12, - "cats" : 3, - } - ``` - -* Asserts for the types of all parameters (except self), for all - functions or methods, all the time, e.g: - - ```python - def do_something(self, other, thing=None): - assert isinstance(thing, str) or thing is None - assert isinstance(other, Some_Object) - ``` - -* Never assume anything in conditions, always deal with all cases. In - practice this means the final else clause in an if statement that - distinguishes on three shape should always raise an ICE (internal - compiler error). That way if somebody adds a new AST node in the - future or changes the tree in some way we immediately get a failre, - instead of silent success or worse silent failure. This is essential - in making sure we can qualify this tool under ISO 26262 with minimal - effort. - -* Avoid throwing or catching exceptions, unless there is no reasonable - alternative. Instead write code that works. :) An exception here is - the actual error mechanism of TRLC, but again there just use the - provided interface, never raise your own exceptions. - -## Tool architecture - -### Files - -The main files are: - -* [trlc.py](../trlc/trlc.py) The main entry point and the - Source_Manager -* [errors.py](../trlc/errors.py) The single place to generate _any_ - message produced by the tools. Defines Message_Handler (the API to - create messages) and Location (a way to point to a specific place in - input sources). -* [lexer.py](../trlc/lexer.py) Defines the Token type and implements a - lexer for the TRLC language. -* [parser.py](../trlc/parser.py) Implements parsers for the TRLC - language and the Markup_String embedded language. -* [ast.py](../trlc/ast.py) Defines the AST. Refer to - [ast_hierarchy](ast_hierarchy.svg) for a visual overview of this. -* [lint.py](../trlc/lint.py) Implements a linter operating on the TRLC - AST. -* [vcg.py](../trlc/vcg.py) Used by the linter to prove absence of - run-time errors on user-defined checks. - -There are also a few utility files: - -* [version.py](../trlc/version.py) Defines the current tool version. -* [nested.py](../trlc/nested.py) Used for creating sub-parses for - languages embedded in TRLC strings. -* [math.py](../trlc/math.py) Implements the integer remainder function - (it's not the same as Python `%`) and the rounding function for - decimal to integer conversions. - -### Overall dataflow -The TRLC tool is actually two tools (the evaluator and the linter), -however there is significant overlap in dataflow. - -* A shared command-line interface in [trlc.py](../trlc/trlc.py) - determines the file set to process and mode of operation (normal - evaluation or analysis with `--lint`). - -* The Source_Manager registers files and decides on the parse - order. For all modes of operation all `.rsl` files are parsed first, - and then all `.check` files. - -* Then in `--lint` mode the [lint.py](../trlc/lint.py) and - [vcg.py](../trlc/vcg.py) modules are used to sanity check types and - user checks, and we then stop with messages and a return code of 0 - or 1. - -* Otherwise in normal mode the Source_Manager proceeds to parse all - `.trlc` files. - -* Afterwards any missing references (i.e. references from things - declared in one file to things declared in another file) are - resolved. - -* Then all user defined check are evaluated. This is implemented as a - tree-walk through the perform_checks function in - [ast.py](../trlc/ast.py). - -At this point the command-line tool stops; but when the Source_Manager -is invoked from the API then the final symbol table is passed on to -the user. - -### Errors and Locations - -There is a single class, Location, an instance of which is attached to -every single node in the AST, and every single token generated by -parser. - -If you want to create a message of any kind, there is a single way to -do it. You need to have a reference to the Message_Handler (usually -called `mh` in the code). - -You then call `mh.warning`, `mh.check`, `mh.error`, `mh.ice_loc` to -create a message. The intended semantics of these are: - -* `warning` should be called for issues that are not outright banned - by the LRM, but are problematic nonetheless. For example duplicate - imports. - -* `check` should be called for user-defined checks or for lint - discovered problems. - -* `error` should be called for lexing issues, syntax error, and other - static violations of language rules. - -* `ice_loc` generates an internal compiler error and hard aborts the - tool execution. Think of this as an assert that should never fail, - but if it does something is truly broken. There should be no way to - actually execute this. - -For example: - -```python -if t_previous.value == t_import.value: - mh.warning(t_import.location, - "duplicate import of package %s" % t_import.value) - return -``` - -This generates on a useful and rich message: - -```plain -import Foo - ^^^ duplicate-imports/bar.trlc:4: warning: duplicate import of package Foo -``` - -Note that you don't have to worry about all the fancy pointing or -reproduction of source text; the Message_Handler will do that for you. - -The `mh.error` method has an optional attribute `fatal` (true by -default). If set then after creating the error an exception of type -`TRLC_Error` is raised. - -The tool catches this exception at the top-level, there should be no -other place where this is caught. - -### Lexer and Parser overview - -The class hierarch for the lexer and parser is a bit more complex: - -![Lexer/Parser Overview](parser_hierarchy.svg) - -In short, the `_Base` classes are abstract bases. There are two lexers -and parsers, one for TRLC itself, and one for the Markup_String -mini-language. The `Nested_Lexer` lexer is used build a new lexer -where the input is not a source file, but instead a string from -TRLC. There is a lot of magic happening with translating from token -error locations from "inside" to the outside string. - -Location is an abstract base for filename / line / column -information. The Source_Reference is a more detailed version of this -linked to a lexer, which also contains source context (e.g. the -original source line). - -The [LRM generator](../trlc-lrm-generator.py) defines its own -`Nested_Lexer`, which should eventually be unified with the -Nested_Lexer from TRLC. - -### Lexer - -The lexer is a hand-crafted lexer. We have chosen to do this over -e.g. using PLY because: - -* No dependencies -* Very precise error location generation was a very important - criteria. It is possible to do this with PLY but it's a major - hassle. - -The lexer is not using the `re` module, instead it considers a sliding -window of 3 characters without back-tracking. - -The only reason the window is 3 characters instead of just 2 is the -`..` operator for ranges. We need to be able to distinguish between -`1.2` and `1..2`. - -### Parser - -The parser is a hand-crafted recursive descent parser. The parser -considers only considers a single token look-ahead. Again, we do not -want to use a generated parser like PLY or AntLR because: - -* No dependencies -* Performance (especially when compared to AntLR) -* Emphasis on creating as much of the semantic resolution as early as - possible when generating the AST. -* Better error messages that come naturally with a recursive descent - parser. -* Two-stage parsing (see below). - -Parsing is a bit weird for `.rsl` and `.trlc` files due to the import -mechanism. When the `Source_Manager` first registers a `.rsl` file we -immediately parse the -[file_preamble](https://bmw-software-engineering.github.io/trlc/lrm.html#lrm-Preamble) -to understand dependencies and determine a parse order. When we parse -the `.trlc` files we again parse them in two parts: first we pre-parse -the preamble for all files; and then in a second step we parse the -rest of all files. - -The naming of parse methods generally follows the naming of -non-terminals in the BNF grammar, e.g. `parse_qualified_name` for -parsing the qualified_name non-terminal. - -In general symbols are immediately resolved to their entities, there -are in general no unresolved references, except in two very specific -cases: - -* References to record object in general are resolved late, because we - need to parse all files in order to know which ones actually exist. -* In the `parse_name` method we delay lookup until we know what we're - supposed to be looking for. The main culprit here is the builtin - functions; a record may have a field called `len` and we won't know - if we should look into the record symbol table or the global symbol - table until we encounter the `(`. - -Speaking of symbol tables, the design of TRLC here mirrors the -philosophy from the GNAT Ada compiler: there is no central symbol -table, instead everything is a tree and some nodes have "symbol -tables" attached to them. - -For example an `Enumeration_Type` has a mini table that stores all its -literals; and in turn this type is in the mini table of its -`Package`. Only the packages are stored in the global symbol table -(which is provided by the `Source_Manager`). - -You can visualise the AST by using the `--debug-dump` option of the -tools. For this file: - -```trlc -package Test2 - -type T2 { - x Integer -} - -checks T2 { - x > 1, fatal "must be positive", x - x != 0, warning "potato" -} -``` - -It generates something like this: - -```plain -Symbol_Table - Builtin_Integer - Builtin_Decimal - Builtin_Boolean - Builtin_String - Builtin_Markup_String - Builtin_Function trlc:len - Builtin_Function trlc:startswith - Builtin_Function trlc:endswith - Builtin_Function trlc:matches - Builtin_Function len - Builtin_Function startswith - Builtin_Function endswith - Builtin_Function matches - Package Test2 - Declared_Late: False - Record_Type T2 - Composite_Component x - Optional: False - Type: Integer - Checks - Fatal error 'must be positive' - Anchor: x - Binary Binary_Operator.COMP_GT Expression - Type: Boolean - Name Reference to x - Integer Literal 1 - Warning 'potato' - Binary Binary_Operator.COMP_NEQ Expression - Type: Boolean - Name Reference to x - Integer Literal 0 -``` - -### The AST - -The most useful entry point here is the hierarchy picture: - -![AST Hierarchy](ast_hierarchy.svg) - -Only leaf nodes can be created. - -The AST is especially picky with its assertions. Each node carries in -its constructor very specific assumptions about the type of it's -children. For example: - -```python -class Quantified_Expression(Expression): - def __init__(self, mh, location, - typ, - universal, - n_variable, - n_source, - n_expr): - super().__init__(location, typ) - assert isinstance(typ, Builtin_Boolean) - assert isinstance(universal, bool) - assert isinstance(n_variable, Quantified_Variable) - assert isinstance(n_expr, Expression) - assert isinstance(n_source, Name_Reference) - self.universal = universal - self.n_var = n_variable - self.n_expr = n_expr - self.n_source = n_source - self.n_expr.ensure_type(mh, Builtin_Boolean) -``` - -For example instead of asserting that n_source is an Expression, or -even Node; we are very precise here in what we require. - -Similarly, functions that add or set things, also must be very -specific. For example: - -```python - def add_item(self, node): - assert isinstance(node, (Concrete_Type, - Check_Block, - Record_Object)) - self.items.append(node) -``` - -Other than this the AST is pretty boring; there is no rewriting or -simplification. The only node worth pointing out as special is -`Name_Reference`, as that is the only node where the entity it refers -to may be filled in late. - -## Evaluation - -Evaluation of expressions is a major component of the language. Each -`Expression` node has a function evaluate: - -``` - def evaluate(self, mh, context): - assert isinstance(mh, Message_Handler) - assert context is None or isinstance(context, dict) -``` - -The context is a mapping of local names to values, this is used when -evaluating a user defined check to bind the component names used in -the check to concrete values. - -The context can be None, in which case evaluation fails with "cannot -be used in a static context" if the expression is not static. This -used in a few places to enforce static values: - -* The right-hand side of the power operator must be static -* The regular expression given to matches must be static - -Evaluation in general is using Value (also defined in ast.py) as a -polymorphic nullable value. Each individual evaluation method is -responsible for the appropriate type checking; this is not delegated -to the Value class (which is really just a container). The Value class -has a type (typ) and value. The type is an instance of the node type -`Type` (e.g. `Builtin_Integer` or `Record_Type`). - -The value is a python value representing it, or None (for null -values). - -* `str` (for `Builtin_String` or `Builtin_Markup_String`) -* `int` (for `Builtin_Integer`) -* `bool` (for `Builtin_Boolean`) -* `list` of `Value` (for `Array_Type`) -* `dict` of `str` -> `Value` (for `Tuple_Aggregate`) -* `fractions.Fraction` (for `Builtin_Decimal`) -* `Record_Reference` (for `Record_Type`; i.e. we store the reference - itself not the object referred to) -* `Enumeration_Literal_Spec` (for `Enumeration_Type`) - -Evaluation itself is pretty simple, we just apply the relevant python -operator or something from math.py. For example for the unary -operators: - -```python - def evaluate(self, mh, context): - assert isinstance(mh, Message_Handler) - assert context is None or isinstance(context, dict) - - v_operand = self.n_operand.evaluate(mh, context) - if v_operand.value is None: - mh.error(v_operand.location, - "input to unary expression %s (%s) must not be null" % - (self.to_string(), - mh.cross_file_reference(self.location))) - - if self.operator == Unary_Operator.MINUS: - return Value(location = self.location, - value = -v_operand.value, - typ = self.typ) - elif self.operator == Unary_Operator.PLUS: - ... -``` - -There is a big assumption made here, in that the tree is correctly -formed (in terms of typ), but this is statically checked at -construction. This is why we don't typecheck when we evaluate unary -minus, but just rely on / assume that the value will be an integer or -fraction. - -In evaluation there are (currently) three places where run-time errors -can be created: - -* Evaluation of null in any context other than equality (or - inequality). -* Division by zero (both integers and decimals). -* Array out-of-bounds. - -Here is a good place to explain a design decision regarding the null -rules of the language and why `null` is only allowed in a very -specific context. - -Every expression is typed, and null should have the correct type, -i.e. if we say `1 == null` then the null should be an -`Builtin_Integer` null. However we also do not want to do multiple -passes over the parse-tree to do type resolution (e.g. like Ada), and -so expressions like `(if a then null elseif (...) else null)` would be -infuriating to deal with. - -Name references that happen to be null are not an issue, because we -always know the type they are supposed to be. For `null` we don't -actually do this (have a polymorphic null), instead we have a -`Null_Literal` that has no type, and then we just restrict the places -it can appear. - -This effectively dodges the issue, without any real loss of generality -in the language; and we can parse everything in one pass and resolve -all types immediately. - -## Linter - -There are two parts to the linter; the classical static analysis part -"linter" (in [lint.py](../trlc/lint.py)) and the more formal methods -based analysis "verification condition generation" (in -[vcg.py](../trlc/vcg.py)). - -The traditional linter is pretty simple: after parsing everything we -do another tree-walk and emit additional messages. - -There are a few exceptions, as some problems are best detected when -parsing for the first time. Hence the `Parser` has a attribute -`lint_mode` that can enable additional messages in this case. However -a design goal in general is separation of concerns, so this method is -only chosen if the alternative would be impossible or extremely -awkward to do. - -An example is the lint check for clarifying final. In the AST we just -know if a record is final or not, we do not know if this was -inherited, or if the keyword was present. In the parser we do. We -could of course modify the AST to record this, but that is generally -not helpful since nobody else (currently) cares if this attribute was -there or not. - -The linter itself is simple and reading the code should make it -obvious how it works. The only important design goal is to try and -implement new checks in lint.py and not parser.py, if at all possible. - -## Verification condition generation - -Once other lint checks have been performed, the linter constructs an -object of class `VCG` (from [vcg.py](../trlc/vcg.py)) for record types -and tuple types, and calls the analysis method. This intends to find -deeper problems with the user types and rules. - -The overall approach is to encode a model of our source language in -[SMTLIB](http://smtlib.cs.uiowa.edu/about.shtml) and feed these -problems to an [SMT -Solver](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories). Depending -on how the solver answers, we can then issue messages informing the -user about problems. - -This feature is gated behind the `--verify` option, as it requires two -additional run-time dependencies: - -* PyVCG [(Github)](https://github.com/florianschanda/PyVCG) - [(PyPI)](https://pypi.org/project/PyVCG/) (for building the SMTLIB - problems) -* CVC5 [(Github)](https://github.com/cvc5/cvc5) - [(PyPI)](https://pypi.org/project/cvc5/) (for solving the SMTLIB - problems) - -### Terminology - -First some terminology that we shall be using: - -* VC: a **V**erification **C**ondition. This is a small logical - problem where we have known facts (e.g. `x > 10`) followed by a - conclusion we want to prove (e.g. `x != 0`). Generally we generate a - number of verification conditions for an expression / program / - function, and if we manage to prove *all* of them, then we can - conclude something (e.g. "we don't crash" or "we don't divide by - zero"). -* Path: a possible execution trace through an expression or program -* Sound: a property of an analysis. A sound analysis has no false - positives, i.e. it does not miss bugs. -* Complete: a property of an analysis. A complete analysis has no - false alarms, i.e. all messages raised really do correspond to a - problem. -* Automatic: a property of an analysis. An automatic analysis does not - require human intelligence or input. -* SAT: **SAT**isfiable, i.e. there is an assignment to a formula that - makes it true. For example `x >= 0 and x <= 10` is SAT, since `x = - 3` would make the entire thing true. -* UNSAT: **UNSAT**isfiable, i.e. there is no assignment to a formula - that makes it true. For example `x == 1 and x == 2` is UNSAT, since - there is no possible value for `x` that would make both equalities - true. - -### Example - -We shall explain the overall process based on a trivial example: - -```trlc -package Potato - -type Kitten { - a Integer - b Integer - c Integer -} - -checks Kitten { - a > 17 and 100 / (a + b * c) > 50, warning "Example" -} -``` - -In this case there are no null dereference problems, but there is a -potential division by zero. - -First we need to understand how many possible execution paths there -are through this: - -* The warning is raised - * (1) Both `a > 17` and `100 / (a + b * c)` are true -* The warning is not raised - * (2) `a <= 17` (in which case we do not care about the rest, as the - and operator has [short-cut - semantics](https://bmw-software-engineering.github.io/trlc/lrm.html#lrm-Shortcut_Logical_Operators). - * (3) `a > 17` and `100 / (a + b * c)` is false - -So here only path (1) and (3) is exciting, since those are the paths -where we can get to the division. Path (2) can never raise a division -by zero error, if the implementation follows the LRM. - -One of the features of PyVCG is that we can build a graph that models -the execution paths of the source language; and we can then ask it to -build VCs for all possible paths. The graph for this looks like this: - -![graph for example](vcg-example/trlc-Potato-Kitten.svg) - -We start at the top. First we need to introduce the things we talk -about (these are the components of our record). - -```lisp -;; value for a declared on potato.rsl:4:3 -(declare-const |Potato.Kitten.a.value| Int) -(define-const |Potato.Kitten.a.valid| Bool true) -;; value for b declared on potato.rsl:5:3 -(declare-const |Potato.Kitten.b.value| Int) -(define-const |Potato.Kitten.b.valid| Bool true) -;; value for c declared on potato.rsl:6:3 -(declare-const |Potato.Kitten.c.value| Int) -(define-const |Potato.Kitten.c.valid| Bool true) -``` - -First note that SMTLIB should be read like LISP: `(` function -operators+ `)`. This means in the first line we declare a constant -(the SMT term for a free variable) by using the `declare-const` -function, and it's arguments are `|Potato.Kitten.a.value|` (i.e. the -name of this constant) and `Int` (i.e. it's type, or sort in SMT). - -We have two constants that we use to model each record field: One for -the actual value, and one indicating if it's null or not. Since all -fields are not optional, all of them are already defined to be -`true`. Note that for the values we didn't do this, since we want the -solver to figure out what they could be. - -Moving to the next node in the graph we see: - -```lisp -;; validity check for a -goal: |Potato.Kitten.a.valid| -``` - -This corresponds to the very first use of a in our expression: - -``` - a > 17 and 100 / (a + b * c) > 50, warning "Example" - ^ this one right here -``` - -We need to check if this `a` could possibly be null. It's kinda -obvious, but we need to do it anyway. - -So we now want to get an SMT solver to figure out if -`|Potato.Kitten.a.valid|` is always true, in every possible instance -of this record. - -To do that is that we *negate* the goal and ask if there is a SAT -assignment. Because if we can find one, the goal is obviously not -always true, and even better we have a *counter-example* we can give -to the user. If the problem turns out to be UNSAT, then we can -conclude by the law of excluded middle, that the original statement -must be always true. - -The complete VC for this check looks like this: - -(We have removed the matches function from this, because it's not -relevant and we'll explain it later.) - -``` -(set-logic QF_UFLIA) -(set-option :produce-models true) - -;; value for a declared on potato.rsl:4:3 -(declare-const |Potato.Kitten.a.value| Int) -(define-const |Potato.Kitten.a.valid| Bool true) -;; value for b declared on potato.rsl:5:3 -(declare-const |Potato.Kitten.b.value| Int) -(define-const |Potato.Kitten.b.valid| Bool true) -;; value for c declared on potato.rsl:6:3 -(declare-const |Potato.Kitten.c.value| Int) -(define-const |Potato.Kitten.c.valid| Bool true) -;; validity check for a -(assert (not |Potato.Kitten.a.valid|)) -(check-sat) -(get-value (|Potato.Kitten.a.value|)) -(get-value (|Potato.Kitten.a.valid|)) -(get-value (|Potato.Kitten.b.value|)) -(get-value (|Potato.Kitten.b.valid|)) -(get-value (|Potato.Kitten.c.value|)) -(get-value (|Potato.Kitten.c.valid|)) -(exit) -``` - -Note: You can see these files if you use the `--debug-vcg` option. - -If we now feed this to a solver, we will immediately get an UNSAT -result. - -After this check we can proceed to the next step. We can compute a -value for the result of `a > 17`. - -```lisp -;; result of a > 17 at potato.rsl:10:5 -(define-const |tmp.1| Bool (> |Potato.Kitten.a.value| 17)) -``` - -Here we store this in a new (intermediate) constant we define just for -this purpose. This activity is not unlike SSA (static single -assignment) that is a common step in compilers. - -We then introduce a branch. In the left hand side we assert that `not -|tmp.1|` is true, and in the right-hand side we assert that `|tmp.1|` is true. This models the and semantics, where we do not proceed to the right-hand side if the left-hand side is false. - -We then continue adding more validity checks (for `a` (again), and -also for `b` and `c`). You might think it would be good to not check -for `a` again, but generally VCG is hard enough as it is, and such -optimisations are more likely to introduce errors than not. So we -leave this for much later if it turns out to be a real problem. - -Afterwards we define intermediates for `b * c` (tmp.3) and then `a + -tmp.3` (tmp.4). We then need to check if this could be zero. So again -we assert that it's not and ask for an assignment: - -```lisp -(define-const |tmp.1| Bool - (> |Potato.Kitten.a.value| 17)) -(assert |tmp.1|) - -;; result of b * c at potato.rsl:10:27 -(define-const |tmp.3| Int - (* |Potato.Kitten.b.value| |Potato.Kitten.c.value|)) - -;; result of a + b * c at potato.rsl:10:23 -(define-const |tmp.4| Int - (+ |Potato.Kitten.a.value| |tmp.3|)) - -;; division by zero check for 100 / a + b * c -(assert (not (not (= |tmp.4| 0)))) -(check-sat) -``` - -The `not not` seems surprising, but again it's just easier this -way. What we want to be true is `tmp.4 != 0`, this translates to `(not -(= |tmp.4| 0))`. So that is our goal, and to find out if the goal is -always true we negate it. So `(not (not ...`. - -And now we get a SAT result, with an assignment: - -```plain -$ cvc5 trlc-Potato-Kitten_0002.smt2 -sat -((Potato.Kitten.a.value 18)) -((Potato.Kitten.a.valid true)) -((Potato.Kitten.b.value 2)) -((Potato.Kitten.b.valid true)) -((Potato.Kitten.c.value (- 9))) -((Potato.Kitten.c.valid true)) -``` - -So now we have a counter-example and we can feed this back to the user: - -```plain -a > 17 and 100 / (a + b * c) > 50, warning "Example" - ^ potato.rsl:10: warning: divisor could be 0 [vc_id = 2] [vcg-div-by-zero] - | example record_type triggering error: - | Kitten bad_potato { - | a = 18 - | b = 2 - | c = -9 - | } -``` - -### Overall architecture - -The general structure of VCG is a tree transformation from the TRLC -AST to the PyVCG graph. - -We start at a composite type, walk over each check's expressions and -build the graph. In general for each expression node in the AST there -is a corresponding `tr_` (for translate) function in VCG. For example -to process `Unary_Expression` we have `tr_unary_expression`. - -Because it may be difficult to support new constructs in VCG when they -are first created, we have a special mechanism to deal with "not yet -supported" features. We have a special exception `Unsupported` and a -`flag_unsupported` method that can be called with a node. For example -at the end of `tr_expression`: - -```python - elif isinstance(n_expr, Field_Access_Expression): - return self.tr_field_access_expression(n_expr) - - else: # pragma: no cover - self.flag_unsupported(n_expr) - - return value, smt.Boolean_Literal(True) -``` - -This is normally dead code, but if somebody adds a new expression type -(maybe let expressions) then this will gracefully fail, e.g: - -```plain - let potato => (x + 1) - ^^^ warning: LET_EXPRESSION not supported yet in VCG -``` - -After the translation is done we use PyVCG to generate individual VCs -for all paths and attempt to solve them. For each we fail, we just -emit the error message that was stored in the VC (when we build VCs we -already attach the message in case it would fail; we don't generate -the message on-the-fly). - -### Model - -This section describes how we model each language construct. - -#### Checks - -For each used-define check we translate the expression and emit checks -(e.g. division by zero) on the way. For fatal checks we then assert -that the expression is true (to model that we only proceed with -execution if the fatal error did not get raised). For any other check -(warnings and errors) we forget the knowledge. - -In general this works by branching off the root node instead of -following the current path in the graph. - -For example the following check sequence: - -```trlc -checks Example { - ..., error "normal_error_1" - ..., fatal "fatal_error_1" - ..., warning "normal_warning_1" - ..., fatal "fatal_error_2" - ..., error, "normal_error_2 -} -``` - -Would generate a (reduced) graph like this: - -![knowledge accumulation example](knowledge_accumulation.svg) - -For example when proving anything about `normal_warning_1` we know -that `fatal_error_1` could not have occurred. But we cannot make the -same assumption about `normal_error_1`, any checks under -`fatal_error_1` do *not* get the truth of `normal_error_1` asserted. - -#### Types - -We model types as follows - -| TRLC Type | PyVCG Sort | SMTLIB Sort | -|------------------|-----------------|-------------| -| Builtin_Boolean | BUILTIN_BOOLEAN | Bool | -| Builtin_Integer | BUILTIN_INTEGER | Int | -| Builtin_Decimal | BUILTIN_REAL | Real | -| Builtin_String | BUILTIN_STRING | String | -| Record_Type | BUILTIN_INTEGER | Int | -| Tuple_Type | Record | datatype | -| Enumeration_Type | Enumeration | datatype | -| Array_Type | Sequence | Seq | - -A few of these need some additional explanation. - -##### Decimal - -The model of Builtin_Decimal as Real is not precise. A decimal number -cannot be 1 / 3, but a real can be. In TRLC expression we can actually -get rationals, but as the user we cannot assign 1 / 3 to a decimal -value (the syntax does not permit it). The means something like - -```trlc - 100 / (x - 1 / 3) -``` - -Should actually be fine, but with our chosen model it's not as there -is an obvious counter-example. However at least this modelling is -sound (but not complete). - -I have created a [ticket with -CVC5](https://github.com/cvc5/cvc5/issues/9868) for a feature request -to assert that some real is actually a decimal, but this is hard. - -We could also model our decimals as integers and then divide them, for -example: - -```lisp -(declare-const |foo.T.x.value.int| Int) -(define-const |foo.T.x.value| Real (/ (to_real |foo.T.x.value.int|) - 1000000)) -``` - -However this is unsound (but complete), as we would need to guess the -maximum accuracy that the user would use. We could do some tricks with -interval arithmetic to estimate a required accuracy. - -In addition, converting between Real and Int in SMTLIB is generally -bad, so there may be other problems attached to this. - -Finally we could also model our reals as rationals, and assert that -the divisor must be a product of 2s and 5s. We tried this with a -recursive function, but these things immediately make everything -undecidable in general. - -##### Records - -It may appear surprising to model records as integers, but we can't -actually access records in the check language. We just need to model -that there are N different records the user could pick when -referencing them. - -##### Tuples - -Tuples are modelled as SMTLIB datatypes, but there is additional -complication here. A tuple is not just a random collection of data -there are additional constraints. - -Specifically we know that: - -* A tuple is valid only if all error and all fatal checks have passed - (compare this to our record, where we can only assume fatal checks). -* A tuple with optional components has an additional constraint that - once you have an optional component, all trailing components are - also null. - -This knowledge is generated with `emit_tuple_constraints` for a -specific tuple. However this is currently not done for tuples in -arrays. - -Note also that we don't worry about validity: in the spirit of modular -analysis this would have been checked when generating VCs for the -tuple type itself. - -We could simply add a universal quantifier for all tuples of type T, -but then adding quantifiers is something we should only do as a last -resort. - -In the future we can detect if we have an array, and only in that -specific case add the quantified constraint. - -This may sound academic, but experience has shown that frivolous use -of quantifiers can be a real problem. - -##### String and Markup_String - -We are using the newly added string theory in SMTLIB to model Strings. - -There are some constraints about our strings that are not yet -asserted: - -* A string can either contain no newlines (it's a "..." String) -* Or a string cannot contain ''' (it's a '''...''' String) -* A markup string has additional constraints when it comes to `[[`, - `]]` and what is permissible between these. - -Right now it didn't seem important to add these constraints, as we -hope that users don't write checks that actually depend on this, as -that seems nuts. But you never know... :) - -##### Arrays - -Arrays are not modelled using the array theory, instead we use the -[non-standard sequence -theory](https://cvc5.github.io/docs-ci/docs-main/theories/sequences.html). - -There are a two good reasons for this choice: - -* Arrays do not have a cardinality constraint, so we'd need to model - that extra if we want to reason about array length. -* Sequences provide some other builtins that we want to use (contains, - prefixof, and suffixof). - -If we want to target a solver in the future that doesn't support this -theory then we can of course do it with Arrays, but it'll be annoying. - -#### Expressions - -Most of the expressions should be fairly simple, with a few exceptions -that we mention here. - -A general note on the translation functions (e.g. `tr_expression`): -each of these always returns a tuple of two values: the translated -expression tree for the *value* of the expression, and the translated -expression tree for the *validity* of the expression assuming no -errors in sub-expressions. - -Especially the latter part ("assuming no errors") is important and -needs to be explained in more detail. - -The value is simple enough: for an expression like `x + y` the value -is some SMT tree that calculates this. - -The validity is more or less a null check. But it's a null check for -*this* expression, not it's sub-expressions. We build VCs in a modular -deductive fashion, and so we have emitted checks earlier. - -Hence for almost all expressions (including `x + y` the validity is -statically true). - -However for the sub-expression the validity is NOT always true, -e.g. for `x` it's the true or false if `x` is optional. - -We do it this way because otherwise we have to consider three-valued -logic, or arithmetic with null, e.g. is the value of `x or y` true if -`x = null` but `y = true`? - -There is one big down-side, that we'll come to later (hint: -quantifiers). - -##### Short-circuits - -The short-circuit expressions (`and`, `or`, `implies`, and `if`) are -modelled in the graph as branches. - -##### Equality - -Equality is the only place where null is considered properly, and it's -weird as a result. - -In general, two things are equal if they are either both null, or they -are not and their values match. But due to our modelling we can't just -do: - -```lisp -(or (= x_value y_value) - (= x_valid y_valid)) -``` - -Specifically this gives the wrong answer if x is null, but y is not -and they both happen to have the same value (since value is -independently modelled from validity). - -In an earlier draft we considered modelling all values as datatypes -that could be null OR carry the value; but this approach was pretty -nasty as it complicated a lot of simple things. - -So instead we define equality instead as: - -```lisp -(and (= x_valid y_valid) - (=> x_valid (= x_value y_value))) -``` - -There is a bit of optimisation in `tr_op_equality` to simplify this to -just `(= x_value y_value)` in most cases, but we can't always do that. - -In addition tuples also make this awful, because we may need to -consider the sequence of optional items. So for tuples we build a very -big conjunction of these kinds of equalities in `tr_core_equality` and -`tr_core_equality_tuple_component`. - -It should be noted that this conjunction for tuple equality relies on -the tuple constraints, so currently for tuples in arrays we don't get -quite the correct answer. - -##### Quantifiers - -Quantifiers are always horrific, and we've made a number of decisions -when it comes to dealing with them. The primary design goal is to not -have them, if in any way possible. This is also why we have not used -tools like [Why3](https://why3.lri.fr/doc/) as our intermediate -language), and instead wrote something new -([PyVCG](https://github.com/florianschanda/PyVCG)). - -First, quantifiers and validity checks work differently. We decided to -over-approximate how they work in order to keep things sane, as the -[LRM -suggests](https://bmw-software-engineering.github.io/trlc/lrm.html#lrm-Quantification_Short_Circuit_Evaluation). - -For the validity checks in quantifiers we perform a quantifier -elimination: we create a new free variable that represents an -arbitrary index into the subject array, and then walk our tree for the -quantifier expression emitting validity checks. - -However for the value of the quantifier and its body we perform a very -different evaluation, eliminating short-circuit semantics. We can do -this because we've proved earlier that there are no run-time errors -for an arbitrary element. - -The VCG class has for this purpose a global variable `functional`, -which we enable and disable to generate the body. If this is set then -instead of modifying the graph we just build one monolithic SMT -expression for the value: - -```python - temp, self.functional = self.functional, True - b_value, _ = self.tr_expression(n_expr.n_expr) - self.functional = temp -``` - -Additional caveat: right now nested quantifiers remain unsupported by -VCG and it's unclear if users ever need this feature. - -A note on expressive power: in our source language we can only ever -quantify over elements of some array; we cannot quantify over the -_index_. This makes some things easier, although in the future this -may be a possible language extension. - -However we've chosen to model quantifiers by quantifying over the -index (with some constraints as to its range) instead of quantifying -over element type and asserting this element is in the array; as the -former gave much better results. - -##### The matches function - -Finally, the builtin `matches` regular expression test is modelled as -an uninterpreted function right now. - -This means for any given string and regex, the solver just decides -randomly; as long as it's consistent. - -Right now this doesn't lose us much, but we could add proper support -for regular expressions as the [SMTLIB String -theory](http://smtlib.cs.uiowa.edu/theories-UnicodeStrings.shtml) -supports it. - -### Building the graph - -When creating the PyVCG graph for our model, we use several utility -functions in VCG to do so: - -* We keep track of the "current" node in `self.current_start`, the - functions below create new things, glue them to the current start, - and then advance current start to point to the new thing. Several - functions that deal with branches make a node of the current start - and restore it at appropriate times. -* `attach_validity_check` is used to create a new check testing if the - given expression is true -* `attach_int_division_check` and `attach_real_division_check` take a - divisor expressions and emit a VC to make sure it's not zero -* `attach_index_check` take a index expression and emit a VC to make - sure it fits in the bounds of the corresponding array -* `attach_feasability_check` works a bit different. It creates a VC to - make sure that the given expression _can_ actually be false. We use - this to figure out if checks are redundant (i.e. always true). -* `attach_assumption` simply injects some new knowledge in the current - branch -* `attach_temp_declaration` also injects new knowledge by creating a - new temporary variable (and optionally statically defining to be - some value) -* `attach_empty_assumption` just creates a new do-nothing node. This - is used in quantifier elimination. diff --git a/docs/bmw_favicon.ico b/docs/bmw_favicon.ico deleted file mode 100644 index 00da2898545ac8666cb025fd7ed7093074fe8c8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmb`Ly>A>v7{ETOFeL<(LyTLgK!(6MEN5V?|K zk&c3f0UOrQn%%|Sj6 z#sS63sivM5G-IRARaWMuD?JYtoU5mv(5o5Ey32Y84c&|GTgrSB@W0_IRFPG=ME^c-{YXZqp{^A6-? zliY;8kNb2bFYg(Q(|nAV`0FgI&fw9TL=EB=s<=;A^1AO{Z}qM4Uz{P;im|+))n3|g z=6NK2CAB*4`_^;(b%rvZL(>LNdDk${d$cF-q3El{+y(r7>`hmBg1l#1)0$#(1DNLd ze18FdJ%d3$Cr^;K?$PzsEAmyI&-WMfFY`Hh25)`#<0bWBp3nCe^mqB3JVD;Q{^;s^ zP0wy6xo*Bke+aAmd!IkP`c7Txt$Oa4@A1~>SoY-O^Pf?#^E%ptYx19>zv}&~sn2tN z?eW+5`O0U|Hy3m07U1JPUF8Y#9z*Z<58mbf^p}2_`YI-8gXiMCCvKri``8!C;ji!U zrOzOpNn>VpUvubt_7(Xy_7hLQCwqBowmbOjqeu8J{T$*3ZMSdPQ2z{E9=9zcnn@{iVa1Om2j+&@oC)HzL zLkrTFKml`+_N6g33z|{iS0Ns!J&MW8a|VNeVwd)@FTg_`VrjNu)4n{WJ_vp4ALMoI z$vcpz^o3%V_mUffp1HJI=+*0)v&l@KZb@CAt-OWevPZ{}m#_S7UO#WojOL?H6*X9g zA+MZJ&ro`-HspNBJLRu>1-%Jt8}#O^H8>at6f38i&eDQr>{WgH=FpR$d}iQ5Uh(-T zr`mts*FLS7>->7hk7#$Y(H5zU_=(n_2U=|KQHL-@mio9&c_O?{99M z+$s*`DR2Fqq5un*`8x&oSwIO>(7g-A%1LtR6?#0YgVX;LibGDdvQL2gB(T(jy3V%f zOEt)q%Ew&jt5|Ek%ckKw?NnF2P^v%ldaYrvvrfTk&usjSY>5~5l+F;#+o?C?r;6j1 z%u7ca(Z_|^Q!n;9vyHP_vw3M$%F`FmIn!Pjx%y4?@4r3sr{|-8CSo_edRFm%7i+A= zHT4MdI{!d*oo&@TeHQZbm*kx0!|(B{R73fA(f1SF(_S;6*#bN~g6_-55B^|Y&-wKH zV - Index — TRLC 1.1.5 documentation + Index — TRLC 1.1.6 documentation @@ -22,7 +22,7 @@

Navigation

- + @@ -63,8 +63,12 @@

A

  • all_names() (trlc.ast.Symbol_Table method) @@ -104,6 +108,32 @@

    B

    C

    + -
    diff --git a/docs/index.html b/docs/index.html index dbc02ec1..88d32e10 100644 --- a/docs/index.html +++ b/docs/index.html @@ -6,7 +6,7 @@ - TRLC Python API — TRLC 1.1.5 documentation + TRLC Python API — TRLC 1.1.6 documentation @@ -27,7 +27,7 @@

    Navigation

  • next |
  • - + @@ -140,7 +140,7 @@

    Navigation

  • next |
  • - + diff --git a/docs/knowledge_accumulation.dot b/docs/knowledge_accumulation.dot deleted file mode 100644 index 0e61b31e..00000000 --- a/docs/knowledge_accumulation.dot +++ /dev/null @@ -1,18 +0,0 @@ -digraph G { - start; - normal_error_1; - fatal_error_1; - normal_warning_1; - fatal_error_2; - normal_error_2; - end; - - start -> fatal_error_1; - start -> normal_error_1; - fatal_error_1 -> normal_warning_1; - fatal_error_1 -> fatal_error_2; - fatal_error_2 -> normal_error_2; - normal_error_1 -> end; - normal_warning_1 -> end; - normal_error_2 -> end; -} diff --git a/docs/knowledge_accumulation.svg b/docs/knowledge_accumulation.svg deleted file mode 100644 index 66f5f2b7..00000000 --- a/docs/knowledge_accumulation.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - -G - - - -start - -start - - - -normal_error_1 - -normal_error_1 - - - -start->normal_error_1 - - - - - -fatal_error_1 - -fatal_error_1 - - - -start->fatal_error_1 - - - - - -end - -end - - - -normal_error_1->end - - - - - -normal_warning_1 - -normal_warning_1 - - - -fatal_error_1->normal_warning_1 - - - - - -fatal_error_2 - -fatal_error_2 - - - -fatal_error_1->fatal_error_2 - - - - - -normal_warning_1->end - - - - - -normal_error_2 - -normal_error_2 - - - -fatal_error_2->normal_error_2 - - - - - -normal_error_2->end - - - - - diff --git a/docs/lrm-2.8.html b/docs/lrm-2.8.html index 4c0a9bb7..420826a4 100644 --- a/docs/lrm-2.8.html +++ b/docs/lrm-2.8.html @@ -1,8 +1,8 @@ -TRLC Language Reference Manual, Version 2.8 - +TRLC 2.8 LRM +
  • index