/
parser.ddgs
66 lines (55 loc) · 1.6 KB
/
parser.ddgs
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
56
57
58
59
60
61
62
63
64
65
66
// parser.ddgs
//
// Copyright Peter Williams 2013 <pwil3058@bigpond.net.au>.
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
%{
// parser.d
//
// Copyright Peter Williams 2013 <pwil3058@bigpond.net.au>.
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
import std.stdio;
%}
%{
double evaluate(string text)
{
double result; // leave initialised as NaN
%}
%field double value
%token PLUS "+"
%token MINUS "-"
%token TIMES "*"
%token DIVIDE "/"
%token <value> NUMBER ([0-9]+(\.[0-9]+){0,1})
%token LPR "("
%token RPR ")"
%token STRING ("(\\"|[^"])*")
%token BOGUS "uv"
%skip (\s+)
%right UMINUS
%left "*" "/"
%left "+" "-"
%%
%inject "/dev/null"
equation: expr !{result = $1.value;!} .
expr: expr "+" expr !{$$.value = $1.value + $3.value;!}
| expr "-" expr !{$$.value = $1.value - $3.value;!}
| expr "*" expr !{$$.value = $1.value * $3.value;!}
| expr "/" expr !{$$.value = $1.value / $3.value;!}
| "(" expr ")" !{$$.value = $2.value;!}
| "-" expr %prec UMINUS !{$$.value = -$2.value;!}
| NUMBER !{$$.value = $1.value;!}
| STRING !{ writeln("string: ", $1.dd_matched_text );!}
| STRING STRING !{ writeln("string 1: ", $1.dd_matched_text, "; string 2:", $2.dd_matched_text );!}
| BOGUS !{!}
.
%{
dd_parse_text(text);
return result;
}
%}