diff --git a/examples/arithmetics/arithmetic.tp2.json b/examples/arithmetics/arithmetic.tp2.json new file mode 100644 index 0000000..42a8420 --- /dev/null +++ b/examples/arithmetics/arithmetic.tp2.json @@ -0,0 +1,101 @@ +{ + "version": "2", + "lexer_rules": [ + { + "pattern": " |\\t|\\n", + "pass": false, + "name": null + }, + { + "pattern": "[0-9]+", + "pass": true, + "name": "[const]" + }, + { + "pattern": "\\+", + "pass": false, + "name": "[plus]" + }, + { + "pattern": "-", + "pass": false, + "name": "[minus]" + }, + { + "pattern": "\\*", + "pass": false, + "name": "[times]" + }, + { + "pattern": "/", + "pass": false, + "name": "[divided]" + }, + { + "pattern": "\\(", + "pass": false, + "name": "[open]" + }, + { + "pattern": "\\)|", + "pass": false, + "name": "[close]" + } + ], + "parser_rules": [ + { + "label": "{constant}", + "premise": "", + "conclusion": [ + {"type": "terminal", "parameters": {"id": "[const]"}} + ] + }, + { + "label": "{product}", + "premise": "", + "conclusion": [ + {"type": "variable", "parameters": {"id": ""}}, + {"type": "terminal", "parameters": {"id": "[times]"}}, + {"type": "variable", "parameters": {"id": ""}} + ] + }, + { + "label": "{quotient}", + "premise": "", + "conclusion": [ + {"type": "variable", "parameters": {"id": ""}}, + {"type": "terminal", "parameters": {"id": "[divided]"}}, + {"type": "variable", "parameters": {"id": ""}} + ] + }, + { + "label": "{sum}", + "premise": "", + "conclusion": [ + {"type": "variable", "parameters": {"id": ""}}, + {"type": "terminal", "parameters": {"id": "[plus]"}}, + {"type": "variable", "parameters": {"id": ""}} + ] + }, + { + "label": "{difference}", + "premise": "", + "conclusion": [ + {"type": "variable", "parameters": {"id": ""}}, + {"type": "terminal", "parameters": {"id": "[minus]"}}, + {"type": "variable", "parameters": {"id": ""}} + ] + }, + { + "label": "{priorised}", + "premise": "", + "conclusion": [ + {"type": "terminal", "parameters": {"id": "[open]"}}, + {"type": "variable", "parameters": {"id": ""}}, + {"type": "terminal", "parameters": {"id": "[close]"}} + ] + } + ], + "parser_start": "" +} + diff --git a/examples/arithmetics/eval b/examples/arithmetics/eval new file mode 100755 index 0000000..25c82c0 --- /dev/null +++ b/examples/arithmetics/eval @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + +import sys as _sys +import json as _json + + +def evaluate(node): + # _sys.stderr.write("eval: %s\n" % _json.dumps(node)) + if (node["label"] == "{constant}"): + return int(node["value"][0]["data"]["value"]) + elif (node["label"] == "{sum}"): + return (evaluate(node["children"][0]) + evaluate(node["children"][1])) + elif (node["label"] == "{difference}"): + return (evaluate(node["children"][0]) - evaluate(node["children"][1])) + elif (node["label"] == "{product}"): + return (evaluate(node["children"][0]) * evaluate(node["children"][1])) + elif (node["label"] == "{quotient}"): + return (evaluate(node["children"][0]) / evaluate(node["children"][1])) + elif (node["label"] == "{priorised}"): + return evaluate(node["children"][0]) + else: + raise ValueError("unhandled label: " + node["label"]) + + +def main(): + content = _sys.stdin.read() + node = _json.loads(content) + value = evaluate(node) + _sys.stdout.write(str(value) + "\n") + + +main() +