72 lines
1.7 KiB
Markdown
72 lines
1.7 KiB
Markdown
# type2
|
|
|
|
— a slow, but versatile reader for arbitrary context free languages (Chomsky hierarchy type 2).
|
|
|
|
Being fed with a JSON file, which specifies the language, and a string via `stdin`, it analyzes the input, decomposes it and writes its corresponding abstract syntax tree to `stdout`.
|
|
|
|
A typical call looks like this: `cat input.txt | type2 language.tp2.json`
|
|
|
|
|
|
## Working principle
|
|
|
|
```mermaid
|
|
flowchart LR
|
|
input_string[input string]
|
|
terminal_symbol_chain[terminal symbol chain]
|
|
abstract_syntax_tree[abstract syntax tree]
|
|
output_string[output string]
|
|
|
|
input_string -- lexical analysis --> terminal_symbol_chain
|
|
terminal_symbol_chain -- parsing --> abstract_syntax_tree
|
|
abstract_syntax_tree -- JSON encoding --> output_string
|
|
```
|
|
|
|
|
|
## Language specification
|
|
|
|
A language is specified by a JSON file, which represents a value of the following type:
|
|
|
|
```
|
|
record<
|
|
version:string,
|
|
lexer_rules:list<
|
|
record<
|
|
pattern:string,
|
|
name:(null|string),
|
|
?pass:boolean
|
|
>
|
|
>,
|
|
parser_rules:list<
|
|
record<
|
|
label:string,
|
|
premise:string,
|
|
conclusion:list<
|
|
record<
|
|
type:string,
|
|
parameters:map<string,any>
|
|
>
|
|
>
|
|
>
|
|
>,
|
|
parser_start:string
|
|
>
|
|
```
|
|
|
|
where:
|
|
- `version` should be `"2"`
|
|
- `lexer_rules.*.pass` controls, whether the read sequence shall be incorporated or not
|
|
- `parser_rules.*.conclusion.*.type` is one of `terminal`, `variable` (see section _Conclusion element types_)
|
|
- `parser_start` is one of the parser rule `label` values
|
|
|
|
The recommended extension for such files is `.tp2.json`.
|
|
|
|
|
|
### Conclusion element types
|
|
|
|
| type | meaning | parameters |
|
|
|-- |-- |-- |
|
|
| `terminal` | the part is a terminal symbol | `id` |
|
|
| `variable` | the part is a syntactic variable | `id` |
|
|
|
|
|