[mod] example:arithmetics
This commit is contained in:
parent
04f19af9f4
commit
0d09f8ff24
|
|
@ -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>"
|
||||
}
|
||||
|
||||
19
examples/arithmetics/arithmetics.tp2
Normal file
19
examples/arithmetics/arithmetics.tp2
Normal 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>
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
5
examples/arithmetics/readme.md
Normal file
5
examples/arithmetics/readme.md
Normal 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`
|
||||
Loading…
Reference in a new issue