[mod] example:arithmetics

This commit is contained in:
Christian Fraß 2022-03-20 21:46:49 +01:00
parent 04f19af9f4
commit 0d09f8ff24
4 changed files with 31 additions and 108 deletions

View file

@ -1,101 +0,0 @@
{
"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": "<expression>",
"conclusion": [
{"type": "terminal", "parameters": {"id": "[const]"}}
]
},
{
"label": "{product}",
"premise": "<expression>",
"conclusion": [
{"type": "variable", "parameters": {"id": "<expression>"}},
{"type": "terminal", "parameters": {"id": "[times]"}},
{"type": "variable", "parameters": {"id": "<expression>"}}
]
},
{
"label": "{quotient}",
"premise": "<expression>",
"conclusion": [
{"type": "variable", "parameters": {"id": "<expression>"}},
{"type": "terminal", "parameters": {"id": "[divided]"}},
{"type": "variable", "parameters": {"id": "<expression>"}}
]
},
{
"label": "{sum}",
"premise": "<expression>",
"conclusion": [
{"type": "variable", "parameters": {"id": "<expression>"}},
{"type": "terminal", "parameters": {"id": "[plus]"}},
{"type": "variable", "parameters": {"id": "<expression>"}}
]
},
{
"label": "{difference}",
"premise": "<expression>",
"conclusion": [
{"type": "variable", "parameters": {"id": "<expression>"}},
{"type": "terminal", "parameters": {"id": "[minus]"}},
{"type": "variable", "parameters": {"id": "<expression>"}}
]
},
{
"label": "{priorised}",
"premise": "<expression>",
"conclusion": [
{"type": "terminal", "parameters": {"id": "[open]"}},
{"type": "variable", "parameters": {"id": "<expression>"}},
{"type": "terminal", "parameters": {"id": "[close]"}}
]
}
],
"parser_start": "<expression>"
}

View file

@ -0,0 +1,19 @@
@1
[] : " |\t|\n"
[const] : "[0-9]+" : ~
[plus] : "\+"
[minus] : "-"
[times] : "\*"
[divided] : "/"
[open] : "\("
[close] : "\)"
{constant} : <expression> : [const]
{product} : <expression> : <expression> [times] <expression>
{quotient} : <expression> : <expression> [divided] <expression>
{sum} : <expression> : <expression> [plus] <expression>
{difference} : <expression> : <expression> [minus] <expression>
{priorised} : <expression> : [open] <expression> [close]
<expression>

View file

@ -6,17 +6,17 @@ import json as _json
def evaluate(node):
# _sys.stderr.write("eval: %s\n" % _json.dumps(node))
if (node["label"] == "{constant}"):
if (node["label"] == "constant"):
return int(node["value"][0]["data"]["value"])
elif (node["label"] == "{sum}"):
elif (node["label"] == "sum"):
return (evaluate(node["children"][0]) + evaluate(node["children"][1]))
elif (node["label"] == "{difference}"):
elif (node["label"] == "difference"):
return (evaluate(node["children"][0]) - evaluate(node["children"][1]))
elif (node["label"] == "{product}"):
elif (node["label"] == "product"):
return (evaluate(node["children"][0]) * evaluate(node["children"][1]))
elif (node["label"] == "{quotient}"):
elif (node["label"] == "quotient"):
return (evaluate(node["children"][0]) / evaluate(node["children"][1]))
elif (node["label"] == "{priorised}"):
elif (node["label"] == "priorised"):
return evaluate(node["children"][0])
else:
raise ValueError("unhandled label: " + node["label"])
@ -26,7 +26,7 @@ def main():
content = _sys.stdin.read()
node = _json.loads(content)
value = evaluate(node)
_sys.stdout.write(str(value) + "\n")
_sys.stdout.write(_json.dumps(value) + "\n")
main()

View file

@ -0,0 +1,5 @@
## Usage
- `cat examples/arithmetics/arithmetics.tp2 | tools/conv > /tmp/arithmetics.tp2.json`
- `echo '2+3' | build/type2 /tmp/arithmetics.tp2.json`
- `echo '(2+3)*5' | build/type2 /tmp/arithmetics.tp2.json | examples/arithmetics/eval`