t.Syntax ::= t.Module | t.Interface

t.Module ::= (MODULE t.ModuleName e.ModuleBody)

t.Interface ::= (INTERFACE t.InterfaceName e.InterfaceBody)

t.ModuleName ::= t.Name

t.InterfaceName ::= t.Name

e.ModuleBody ::= t.Item | e.ModuleBody t.Item 

t.Item ::= t.Function | t.Object | t.Const

s.Linkage ::= s.IntLinkage | s.ExtLinkage

s.IntLinkage ::= EXPORT | LOCAL

s.ExtLinkage ::= IMPORT

t.Function ::= (s.IntLinkage s.FunctionTag t.Pragma t.FunctionName
                t.InputFormat t.OutputFormat t.Branch)
             | (s.ExtLinkage s.FunctionTag t.Pragma t.FunctionName
                t.InputFormat t.OutputFormat)

s.FunctionTag ::= FUNC | FUNC?

t.Pragma ::= (PRAGMA e.PragmaBody)

e.PragmaBody ::= [Empty] | t.PragmaTerm e.PragmaBody

t.PragmaTerm ::= (FILE e.FileName)
               | (LINE s.Line s.Column)
               | (TRACE e.TraceNames)

e.FileName ::= [Sequence of liters]

s.Line ::= [Number]

s.Column ::= [Number]

e.TraceNames ::= [Empty] | t.TraceName e.TraceNames

t.TraceName ::= t.Name

t.FunctionName ::= t.Name

t.InputFormat ::= t.FunFormat

t.OutputFormat ::= t.FunFormat

t.FunFormat ::= (e.HardExpression)

t.Format ::= (FORMAT t.Pragma e.HardExpression)

e.HardExpression ::= e.HardTerms
                   | e.HardTerms t.EVar e.HardTerms
                   | e.HardTerms t.VVar e.HardTerms

e.HardTerms ::= [Empty] | t.HardTerm e.HardTerms

t.HardTerm ::= t.Symbol | (PAREN e.HardExpression) | t.SVar | t.TVar

e.Sentence ::= [Empty] | t.Statement e.Sentence

t.Statement ::= t.Action | t.Operator | t.ComplexOperator

t.Action ::= t.Alt | t.Pattern | t.Result | t.Format

t.Alt ::= (ALT  t.Pragma e.Branches)
        | (ALT? t.Pragma e.Branches)

e.Branches ::= [Empty] | t.Branch e.Branches

t.Branch ::= (BRANCH t.Pragma e.Sentence) 

t.Operator ::= (CUT    t.Pragma)
             | (CUTALL t.Pragma)
             | (STAKE  t.Pragma)
             | (FAIL   t.Pragma)
             | (NOFAIL t.Pragma)

t.ComplexOperator ::= (NOT   t.Branch)
                    | (ERROR t.Branch)
                    | (ITER  t.IterBody t.IterVars)
                    | (TRY   t.TryBranch t.CatchBranch)

t.IterBody ::= t.Branch

t.IterVars ::= t.Format

t.TryBranch ::= t.Branch

t.CatchBranch ::= t.Branch

t.Pattern ::= (LEFT  t.Pragma e.PatternExpression)
            | (RIGHT t.Pragma e.PatternExpression)

e.PatternExpression ::= [Empty] | t.PatternTerm e.PatternExpression

t.PatternTerm ::= t.Symbol | (PAREN e.PatternExpression) | t.Variable

t.Variable ::= t.EVar | t.VVar | t.TVar | t.Svar

t.EVar ::= (EVAR t.Pragma t.Name) | (EVAR)

t.VVar ::= (VVAR t.Pragma t.Name) | (VVAR)

t.TVar ::= (TVAR t.Pragma t.Name) | (TVAR)

t.SVar ::= (SVAR t.Pragma t.Name) | (SVAR)

t.Name ::= (e.QualifiedName)

e.QualifiedName ::= [Word] | e.QualifiedName [Word]

t.Result ::= (RESULT t.Pragma e.ResultExpression) 

e.ResultExpression ::= [Empty]
                     | t.ResultTerm e.ResultExpression
                  // | t.Alt e.ResultExpression

t.ResultTerm ::= t.Symbol | (PAREN e.ResultExpression) | t.Variable
               | (CALL t.Pragma e.ResultExpression)

t.Symbol ::= s.ObjectSymbol | (REF t.Name)

s.ObjectSymbol ::= [Symbol]

t.Object ::= (s.Linkage s.ObjectType t.Pragma t.ObjectName)

s.ObjectType ::= TABLE | BOX | STRING | VECTOR | CHANNEL

t.ObjectName ::= t.Name

t.Initializer ::= (EXEC e.ResultExpression)

t.Const ::= (s.Linkage CONST t.Pragma t.ConstName e.ConstExpression)

t.ConstName ::= t.Name

e.ConstExpression ::= [Empty] | t.ConstTerm e.ConstExpression

t.ConstTerm ::= t.Symbol | (PAREN e.ConstExpression)

