lytlang/src/lytlang_parser.yrl

105 lines
1.9 KiB
Erlang

Nonterminals
grammar
expr_list
expr
assign_expr
add_expr
sub_expr
mult_expr
div_expr
idiv_expr
unary_expr
max_expr
number
unary_op
add_op
sub_op
mult_op
div_op
idiv_op
.
Terminals
var float integer eol
'+' '-' '*' '/' '//' '(' ')' '='
.
Rootsymbol grammar.
Endsymbol '$end'.
Right 100 '='.
Left 300 '+'.
Left 300 '-'.
Left 400 '*'.
Left 400 '/'.
Left 400 '//'.
grammar -> expr_list : '$1'.
grammar -> '$empty' : [].
expr_list -> eol : [].
expr_list -> expr : ['$1'].
expr_list -> expr eol : ['$1'].
expr_list -> eol expr_list : '$2'.
expr_list -> expr eol expr_list : ['$1'|'$3'].
%% Minimum expressions
max_expr -> var : '$1'.
max_expr -> number : '$1'.
max_expr -> '(' expr ')' : '$2'.
%% Numbers
number -> float : '$1'.
number -> integer : ?e(3, '$1').
%% Unary operator
unary_op -> '+' : '$1'.
unary_op -> '-' : '$1'.
%% Infix Operators
add_op -> '+' : '$1'.
sub_op -> '-' : '$1'.
mult_op -> '*' : '$1'.
div_op -> '/' : '$1'.
idiv_op -> '//' : '$1'.
expr -> mult_expr : '$1'.
expr -> div_expr : '$1'.
expr -> idiv_expr : '$1'.
expr -> assign_expr : '$1'.
expr -> add_expr : '$1'.
expr -> sub_expr : '$1'.
expr -> unary_expr : '$1'.
expr -> max_expr : '$1'.
assign_expr -> var '=' expr :
{ '=', ?meta('$2'), [?var('$1'), '$3'] }.
%% Arithmetic operations
add_expr -> expr add_op expr :
{ '+', ?meta('$2'), ['$1', '$3'] }.
sub_expr -> expr sub_op expr :
{ '-', ?meta('$2'), ['$1', '$3'] }.
mult_expr -> expr mult_op expr :
{ '*', ?meta('$2'), ['$1', '$3'] }.
div_expr -> expr div_op expr :
{ '/', ?meta('$2'), ['$1', '$3'] }.
idiv_expr -> expr idiv_op expr :
{ 'div', ?meta('$2'), ['$1', '$3'] }.
unary_expr -> unary_op expr :
{ unary_op, ?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'}).