lytlang/src/lytlang_parser.yrl

87 lines
1.5 KiB
Erlang

Nonterminals
grammar
e_list
e
assignment
add
sub
mult
div
idiv
unary
number
unary
.
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'].
%% Minimum expressions
e -> var : '$1'.
e -> number : '$1'.
e -> '(' e ')' : '$2'.
%% Numbers
number -> float : '$1'.
number -> integer : ?e(3, '$1').
e -> mult : '$1'.
e -> div : '$1'.
e -> idiv : '$1'.
e -> assignment : '$1'.
e -> add : '$1'.
e -> sub : '$1'.
e -> unary : '$1'.
assignment -> var '=' e :
{ '=', ?meta('$2'), [?var('$1'), '$3'] }.
%% Arithmetic operations
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'}).