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'}).