'{*' Rawcode '*}'
{Tblproc :: CodeBlockPrint ('hh', $ _ [4], 0);}
| code 'Tab' '{*' rawcode '*}'
{Tblproc :: CodeBlockPrint ('tab', $ _ [4], 0);}
| code 'Def' '{*' rawcode '*}'
{Tblproc :: CodeBlockPrint ('cc', $ _ [4], 0);}
| code 'def' 'Top' '{*' rawcode '*}'
{Tblproc :: CodeBlockPrint ('cc', $ _ [5], 1);}
| code '{*' rawcode '*}'
{Tblproc :: CodeBlockPrint ('all', $ _ [3], 0);}
;
# ---------------------------------------------- -----------
enumblock: 'enum' id '{' Enumlist '}' ';'
{Tblproc :: EnumBlockPrint ($ _ [2], $ _ [4]);}
| 'enum' id ';' p> {Tblproc :: EnumBlockPrint ($ _ [2], []);}
;
enumlist: enumitem {[$ _ [1]]}
| enumitem ',' Enumlist {unshift @ {$ _ [3]}, $ _ [1]; $ _ [3]}
;
enumitem: id {[$ _ [1],'']}
| id '=' num {[$ _ [1], $ _ [3]]}
;
# ---------------------------------------------- -----------
structblock: 'struct' id '{' structlist '}' ';'
{Tblproc :: StructBlockPrint ($ _ [2], $ _ [4]);}
;
structlist: structitem {[$ _ [1]]}
| structitem structlist {unshift @ {$ _ [2]}, $ _ [1]; $ _ [2]}
;
structitem: id pnlistid ';'
{[$ _ [1], @ {$ _ [2]} [0], @ {$ _ [2]} [1]]}
;
# ---------------------------------------------- -----------
tableblock: tableforward
{Tblproc :: TableBlockPrint (@ {$ _ [1]} [0],'', [], []);}
| tablehead ';' p> {tblproc :: TableBlockPrint (@ {$ _ [1]} [0], @ {$ _ [1]} [1], @ {$ _ [1]} [2], []);} p> | tablehead tail ';'
{Tblproc :: TableBlockPrint (@ {$ _ [1]} [0], @ {$ _ [1]} [1], @ {$ _ [1]} [2], $ _ [2]);}
;
tail: idxtailitem {$ _ [1]}
| idxtailitem tail {unshift @ {$ _ [2]}, $ _ [1]; $ _ [2]}
| optiontailitem
| optiontailitem tail
;
tableforward: 'table' id ';' {[$ _ [2]]}
;
tablehead: 'table' memmodifid '{' memberlist '}'
{[@ {$ _ [2]} [0], @ {$ _ [2]} [1], $ _ [4]]}
;
memmodifid: id {[$ _ [1],'']}
| memmodificator id {[$ _ [2], '$']}
;
memberlist: memberitem {[$ _ [1]]}
| memberitem memberlist {unshift @ {$ _ [2]}, $ _ [1]; $ _ [2]}
;
memberitem: id pnlistid ';'
{[$ _ [1], @ {$ _ [2]} [0], @ {$ _ [2]} [1], []]}
| id pnlistid modificator1 ';'
{[$ _ [1], @ {$ _ [2]} [0], @ {$ _ [2]} [1], $ _ [3]]}
;
modificator1: idxmodificator {[$ _ [1],'']}
# | idxmodificator memmodificator {[$ _ [1], '$','']}
| idxmodificator '{*' rawcode '*}' {[$ _ [1], $ _ [3]]}
# | idxmodificator memmodificator '{*' rawcode '*}' {[$ _ [1], '$', $ _ [4]]}
;
pnlistid: pnlist id {[$ _ [1], $ _ [2]]}
| id {[[], $ _ [1]]}
;
pnlist: pointer {[$ _ [1],'']}
| pointer array {[$ _ [1], $ _ [2]]}
| array {['', $ _ [1]]}
;
pointer: '+'
| '-'
| '*' p>;
array: '[' id ']' {$ _ [2]}
| '[' num ']' {$ _ [2]}
;
idxmodificator: '.!'
| ':!'
| '%!'
| '. +'
| ': +'
| '% +'
| '. -'
| ': -'
| '% -'
| '. ^'
| ': ^'
| '% ^'
;
memmodificator: '$' p>;
idxtailitem: 'idx' idxitem {[$ _ [2]]}
| 'idx' '{' idxitemlist '}' {$ _ [3]}
;
optiontailitem: 'option' '{' Oplist '}'
| 'option' opitem
;
# ---------------------------------------------- -----------
%%
use tblproc;
Основними компонентами цієї граматики є:
В· option - елемент мови, що визначає налаштування до конкретної таблиці.
В· Idx блок - це блок, визначальний параметри індексного таблиці.
В· Table блок - блок, що визначає таблицю, її записи й індекси.
В· Struct блок - блок, аналогічний table, з тією різницею, генерує тільки визначення структур записів без визначення самої...