74 lines
1.9 KiB
Erlang
74 lines
1.9 KiB
Erlang
Nonterminals
|
|
grammar e_list e assignment add sub mult div idiv unary number list map_el map.
|
|
|
|
Terminals
|
|
var float integer eol '+' '-' '*' '/' '//' '(' ')' '=' '"' '\'' '{' '}' '[' ']' '<' '>' ',' ':'.
|
|
|
|
Rootsymbol grammar.
|
|
Endsymbol '$end'.
|
|
|
|
Right 100 '='.
|
|
Left 300 '+'.
|
|
Left 300 '-'.
|
|
Left 400 '*'.
|
|
Left 400 '/'.
|
|
Left 400 '//'.
|
|
|
|
grammar -> e_list : '$1'.
|
|
grammar -> '$empty' : [].
|
|
|
|
e_list -> eol : [].
|
|
e_list -> e : ['$1'].
|
|
e_list -> e eol : ['$1'].
|
|
e_list -> eol e_list : '$2'.
|
|
e_list -> e eol e_list : ['$1' | '$3'].
|
|
|
|
e -> '<' e ',' e '>' : {'$2', '$4'}.
|
|
e -> '<' list '>' : {'{}', [], '$2'}.
|
|
|
|
e -> '[' ']' : [].
|
|
e -> var : ?var('$1').
|
|
e -> number : '$1'.
|
|
e -> '(' e ')' : '$2'.
|
|
e -> mult : '$1'.
|
|
e -> div : '$1'.
|
|
e -> idiv : '$1'.
|
|
e -> assignment : '$1'.
|
|
e -> add : '$1'.
|
|
e -> sub : '$1'.
|
|
e -> unary : '$1'.
|
|
e -> '"' '"' : list_to_binary([]).
|
|
e -> '"' var '"' : list_to_binary('$2').
|
|
e -> '[' list ']' : '$2'.
|
|
e -> '{' map '}' : '$2'.
|
|
|
|
list -> '$empty' : [].
|
|
list -> e : ['$1'].
|
|
list -> e ',' list : ['$1' | '$3'].
|
|
|
|
map_el -> var ':' e : {?e(3, '$1'), '$3'}.
|
|
|
|
map -> '$empty' : {'%{}', [], []}.
|
|
map -> map_el : {'%{}', [], ['$1']}.
|
|
map -> map_el ',' map : {'%{}', [], ['$1' | '$3']}.
|
|
|
|
number -> float : ?e(3, '$1').
|
|
number -> integer : ?e(3, '$1').
|
|
assignment -> var '=' e : { '=', ?meta('$2'), [?var('$1'), '$3'] }.
|
|
add -> e '+' e : { '+', ?meta('$2'), ['$1', '$3'] }.
|
|
sub -> e '-' e : { '-', ?meta('$2'), ['$1', '$3'] }.
|
|
mult -> e '*' e : { '*', ?meta('$2'), ['$1', '$3'] }.
|
|
div -> e '/' e : { '/', ?meta('$2'), ['$1', '$3'] }.
|
|
idiv -> e '//' e : { 'div', ?meta('$2'), ['$1', '$3'] }.
|
|
unary -> '+' e : { '+', ?meta('$1'), ?op('$1'), '$2' }.
|
|
unary -> '-' e : { '-', ?meta('$1'), ?op('$1'), '$2' }.
|
|
|
|
Erlang code.
|
|
|
|
-define(e(N, Node), element(N, Node)).
|
|
-define(op(Node), ?e(1, Node)).
|
|
-define(char(Node), ?e(3, Node)).
|
|
-define(meta(Node), [?line(Node)]).
|
|
-define(line(Node), {line, ?e(2, Node)}).
|
|
-define(var(Node), {?e(3, Node), [], 'Lytlang'}).
|