#include "aux/universal.h"

COMPILER Universal

bool checkTokenAfterIdent(int key){
  if (la->kind != _ident) return false;
  return  scanner->Peek()->kind  == key;
}

bool checkAssignment()
{
  return checkTokenAfterIdent(_assign);
}

CHARACTERS
  letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
  digit = "0123456789".
  any = ANY - '"'.
  cr  = '\r'.
  lf  = '\n'.
  tab = '\t'.
  
TOKENS
  string = '"' { any } '"'.
  ident = (letter | '_') {letter | digit | '_'}.
  assign = '='.
  lp = '('. 
  rp = ')'. 
  tagcolon   = "::".
  
COMMENTS FROM "/*" TO "*/" NESTED
COMMENTS FROM "//" TO lf

IGNORE cr + lf + tab

PRODUCTIONS

ArgList = lp { Expr [','] } rp.
Block = '{' '}'.

MetaExpr = ident [MetaArgList].
MetaArgList = lp { MetaExpr [','] } rp.
MetaExprList = {MetaExpr ';'}.

Expr = 
  ident        (. send(std::wstring(L"Expr: ") + t->val); .)
  [ArgList] 
  [tagcolon MetaExprList]
  {ident Block} [Block]
.  

Decl =   
  (IF(checkAssignment()) ident (. send(std::wstring(L"Decl: ") + t->val); .)
  assign | )
  Expr
.  
  
Universal = {Decl ['.']} .

END Universal.
