forked from hbbio/webshell
/
parser.opa
55 lines (44 loc) · 1.46 KB
/
parser.opa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// license: AGPL
// (c) MLstate, 2011
// author: Adam Koprowski, Henri Binsztok
client module Calc {
function int_of_string(string str) { (option(int)) Parser.try_parse(Rule.integer, str); }
function nat_of_string(string str) { (option(int)) Parser.try_parse(Rule.natural, str); }
function ws(p) {
parser
| Rule.ws res=p Rule.ws -> res
}
`(` = ws(parser | "(" -> void)
`)` = ws(parser | ")" -> void)
term = parser
| f = {ws(Rule.float)} -> f
| `(` ~expr `)` -> expr
factor = parser
| ~term "*" ~factor -> term * factor
| ~term "/" ~factor -> term / factor
| ~term -> term
expr = parser
| ~factor "+" ~expr -> factor + expr
| ~factor "-" ~expr -> factor - expr
| ~factor -> factor
search = ws(parser | "search" -> void)
set = ws(parser | "set" -> void)
next = ws(parser | "next" -> void)
prev = ws(parser | "prev" -> void)
page = ws(parser | "page" -> void)
args = parser | txt=(.*) -> List.map(String.trim,String.explode(" ",Text.to_string(txt)))
shell = parser
| search ~args -> { search:args }
| set ~args -> { set:args }
| next -> { next }
| prev -> { prev }
| page pagenum={ws(Rule.natural)} -> { ~pagenum }
| command={ws(Rule.ident)} arg={ws(Rule.ident)} -> { ~command, ~arg }
| ~expr -> {value: expr}
function compute(s) {
match (Parser.try_parse(expr, s)) {
case {some: result}: "{result}";
case {none}: "unknown";
}
}
}