%macro
{exp} '(([eE]\-?[0-9]+)?)';
%expression Main
'\"' %ignore, %push DQuoteString;
'''' %ignore, %push SQuoteString;
'\"\"' emptyString, 'emptyQuotedString';
'/\*' %ignore, %push MLCom;
'//' %ignore, %push SLCom;
'[ \n\t\r]+' %ignore;
'>>' DependOp 'DependOp';
'\.' Period, 'period';
'\[' leftBracket, '[';
'\]' rightBracket, ']';
'\{' leftBrace, '{';
'\}' rightBrace, '}';
'\(' OParen, '(';
'\)' CParen, ')';
'[a-zA-Z][a-zA-Z0-9]*' MetaName, 'MetaName';
'[aA][gG][gG][rR][eE][gG][aA][tT][eE][sS]' aggregateSpecifier, 'Aggregates';
'[dD][eE][tT][aA][iI][lL][sS]' detailSpecifier, 'Details';
',' Comma, ',';
';' SemiColon, ';';
'[aA][nN][dD]' And, 'and';
'[aA][lL][lL]' All, 'All';
'[cC][hH][iI][lL][dD][rR][eE][nN]' Children, 'Children';
'[sS][uU][bB][sS][eE][tT]' Subset, 'Subset';
//------------------------------------------------------------------------
// Multi-line comments (C Style)
//------------------------------------------------------------------------
%expression MLCom
'.' %ignore;
'\n' %ignore;
'\*/' %ignore, %pop;
//------------------------------------------------------------------------
// Single line comments (C++ style)
//------------------------------------------------------------------------
%expression SLCom
'.' %ignore;
'\n' %ignore, %pop;
//---------------------------------------------------------------------------
// Double quote string handler (For Strings)
//---------------------------------------------------------------------------
%expression DQuoteString
'[^\n"]+' String, 'string', %goto DQuoteStringEnd;
'\"' String, %pop;
//---------------------------------------------------------------------------
// Double quote string end handler (For Strings)
//---------------------------------------------------------------------------
%expression DQuoteStringEnd
'\"' %ignore, %pop;
//---------------------------------------------------------------------------
// Single quote string handler (For Symbols)
//---------------------------------------------------------------------------
%expression SQuoteString
'[^\n'']+' Symbol, 'symbol', %goto SQuoteStringEnd;
'''' Symbol, %pop;
//---------------------------------------------------------------------------
// Single quote string end handler (For Symbols)
//---------------------------------------------------------------------------
%expression SQuoteStringEnd
'''' %ignore, %pop;
//------------------------------------------------------------------------
// Precedence table
//------------------------------------------------------------------------
%prec
1, 'DependOp', %nonassoc;
2, 'and', %nonassoc;
3, 'period', %left;
//------------------------------------------------------------------------
// Grammar
//------------------------------------------------------------------------
%production start
Start start -> ruleList;
StartNull start -> ;
RuleListOne ruleList -> ruleStatement;
RuleListMulti ruleList -> ruleList ruleStatement;
Rule ruleStatement -> precedent 'DependOp' dependentList ';';
DependentListOne dependentList -> LHS_expr;
DependentListMulti dependentList -> dependentList ',' LHS_expr;
//DependentSimple dependent -> LHS_expr;
LHSCompound LHS_expr -> LHS_expr 'and' LHS_expr;
ExprLHSNull LHS_expr -> '{' '}';
ExprLHSList LHS_expr -> '{' memberList '}';
ExprLHSExpr LHS_expr -> member_set_expr;
ExprLHSAgg LHS_expr -> 'Aggregates';
ExprLHSDet LHS_expr -> 'Details';
ExprLHSAll LHS_expr -> 'All';
MemberLOne memberList -> member_set_expr;
MemberL memberList -> memberList ',' member_set_expr;
MemberSimple member_expr -> aSymbol;
MemberQualif member_expr -> aSymbol 'period' aSymbol;
MemberString1 member_expr -> 'string';
MemberStringString member_expr -> 'string' 'period' 'string';
MemberStringSymbol member_expr -> 'string' 'period' aSymbol;
MemberSymbolString member_expr -> aSymbol 'period' 'string';
SymSimple aSymbol -> 'MetaName';
SymQuoted aSymbol -> 'symbol';
MemberFunc1 member_set_expr -> member_expr;
MemberFunc2 member_set_expr -> member_expr 'period' member_func;
DimSubset1 member_set_expr -> aSymbol 'period' 'Subset' '(' aSymbol ')';
MemFunc1 member_func -> 'Children' '(' ')';
PrecedentSimple precedent -> cellSpec;
PrecedentCrossCube precedent -> cubeName 'period' cellSpec;
CubeNameString cubeName -> 'string';
CubeNameSymbol cubeName -> aSymbol;
CellSpec cellSpec -> '[' cellMemberList ']';
CellMemberListSimple cellMemberList -> member_expr;
CellMemberListMulti cellMemberList -> cellMemberList ',' member_expr