Initial version of mdx-tools.pl
[mdx-tools.git] / grammar.txt
blob0ffd338b90ce340a2bbffda5db17083805cca8ae
1 { use Data::Dumper; }
3 parse_mdx : toplevel_spec
5 toplevel_spec : select_spec eof
6     { $return = $item[1] }
8 select_spec : /select/i axis_spec(1..2 /,/) using_spec(?) where_spec(?) ';'
9     { $return = {
10         'head'  => 'mdx_query',
11         'axes'  => $item[2],
12         'using' => $item[3][0],
13         'slice' => $item[4][0] }}
15 axis_spec : (/non empty/i)(?) mdx_elt /on/i axis_name
16     { $return = {
17         'axis' => $item[4],
18         'spec' => $item[2],
19         'flag' => (defined $item[1][0]) ? 1 : 0 }}
21 axis_name : /cols/i
22           | /rows/i
23     { $return = $item[1] }
25 using_spec : /using/i mdx_eid
26     { $return = $item[2] }
28 where_spec : /where/i mdx_elt
29     { $return = $item[2] }
31 fun_literal : /[[:alpha:]][[:alnum:]]*/
32     { $return = $item[1] }
34 mdx_mth : mdx_eid '->' mdx_fun
35     { $return = {
36         'head' => 'mdx_fun',
37         'func' => $item[3]->{'func'},
38         'tail' => [ $item[1], @{$item[3]->{'tail'}} ] }}
39         | mdx_eid '->' fun_literal
40     { $return = {
41         'head' => 'mdx_fun',
42         'func' => $item[3],
43         'tail' => [ $item[1] ] }}
45 mdx_fun : fun_literal '(' mdx_elt(s? /,/) ')'
46     { $return = {
47         'head' => 'mdx_fun',
48         'func' => $item[1],
49         'tail' => $item[3] }}
51 mdx_set : mdx_eid ':' mdx_eid
52     { $return = {
53         'head' => 'mdx_range',
54         'init' => $item[1],
55         'stop' => $item[3] }}
56         | '{' mdx_elt(s? /,/) '}'
57     { $return = {
58         'head' => 'mdx_set',
59         'tail' => $item[2] }}
61 mdx_tup : '(' mdx_elt(s? /,/) ')'
62     { $return = {
63         'head' => 'mdx_tup',
64         'tail' => $item[2] }}
66 eid_literal : /([[:alpha:]][[:alnum:]]*)/
67             | /\[((?:\]\]|[^\]])+)\]/
68     { $return = $1 }
70 mdx_eid : eid_literal(s /\./)
71     { $return = {
72         'head' => 'mdx_eid',
73         'tail' => $item[1] }}
75 mdx_str : /"(?:\\"|[^"])*"/
76         | /'(?:\\'|[^'])*'/
77     { $return = {
78         'head' => 'mdx_str',
79         'tail' => $item[1] }}
81 mdx_elt : mdx_mth
82         | mdx_fun
83         | mdx_set
84         | mdx_tup
85         | mdx_str
86         | mdx_eid
87     { $return = $item[1] }
89 index   : /[\d]+/
91 eof     : /^\Z/
93 #mdx_bool :
95 #(/or/i | '||')
96 #(/xor/i | '^^')
97 #(/and/i | '&&')
99 #(/not/i | '!')
101 #/empty\?/i
103 #mdx_cmp : '>='
104 #        | '>'
105 #        | '<='
106 #        | '<'
107 #        | '<>'
108 #        | '='