# Yacc Form of grammar AQL.grm

Copyright © 2013 by Hassan Aït-Kaci; All Rights Reserved.

This yacc grammar was generated on Wed Jan 30 13:24:29 CET 2013 from the annotated Jacc grammar file `AQL.grm`.

    Statements_opt
    	: /* empty */
    	| Statements_opt Statement
    	;

    Statement
    	: '#' Pragma PragmaArgument_opt EOS
    	| DefinitionStatement
    	| '?' Expression EOS
    	| Expression EOS
    	| error EOS
    	| ';'
    	;

    DefinitionStatement
    	: 'define' DefinitionKind EOS
    	| StructureOrClassDeclaration
    	;

    DefinitionKind
    	: 'operator' Operator SPECIFIER INT
    	| 'signature' Operator Typing
    	| 'type' 'alias' ID TypeParameters_opt '=' Type
    	| 'type' 'name' ID TypeParameters_opt '=' Type
    	| 'value' Definition
    	| Definition
    	;

    StructureOrClassDeclaration
    	: 'structure' ID TypeParameters_opt '{' NamedTupleTypeComponents '}'
    	| 'class' ID TypeParameters_opt Interface Implementation_opt
    	;

    Pragma
    	: ID
    	;

    PragmaArgument_opt
    	: /* empty */
    	| STRING
    	;

    EOS
    	: ';'
    	;

    Typing_opt
    	: /* empty */
    	| Typing
    	;

    Typing
    	: ':' Type
    	;

    Type_opt
    	: /* empty */
    	| Type
    	;

    Type
    	: TypeConstant
    	| FunctionType
    	| TupleType
    	| ArrayType
    	| CollectionType
    	| IntRangeType
    	| RealRangeType
    	| TypeTerm
    	| '(' Type_opt ')'
    	| '[' PrimitiveType ']'
    	| 'forall' TypeParameters '.' Type
    	;

    TypeConstant
    	: PrimitiveType
    	| 'string'
    	;

    PrimitiveType
    	: 'void'
    	| 'int'
    	| 'boolean'
    	| 'char'
    	| 'real'
    	;

    FunctionType
    	: Type '->' Type
    	| '(' Types_opt ')' '->' Type
    	;

    TupleType
    	: '<' TupleTypeComponents '>'
    	;

    TupleTypeComponents
    	: Types_opt
    	| NamedTupleTypeComponents
    	;

    NamedTupleTypeComponents
    	: NamedTupleTypeComponent
    	| NamedTupleTypeComponents ',' NamedTupleTypeComponent
    	;

    NamedTupleTypeComponent
    	: ID Typing
    	;

    ArrayType
    	: Type '[' IndexType ']'
    	;

    IndexType
    	: IntType_opt
    	| MapIndexType
    	;

    IntType_opt
    	: /* empty */
    	| 'int'
    	;

    MapIndexType
    	: SetType
    	| IntRangeType
    	;

    CollectionType
    	: SetType
    	| NonSetKind '{' Type_opt '}'
    	;

    CollectionKind
    	: SetKind
    	| NonSetKind
    	;

    SetKind
    	: 'set'
    	;

    NonSetKind
    	: 'bag'
    	| 'list'
    	;

    SetKind_opt
    	: /* empty */
    	| SetKind
    	;

    SetType
    	: SetKind_opt '{' Type_opt '}'
    	;

    IntRangeType
    	: 'int' '..' 'int'
    	;

    RealRangeType
    	: 'real' '..' 'real'
    	;

    TypeTerm
    	: ID
    	| ID '(' Types ')'
    	;

    Types_opt
    	: /* empty */
    	| Types
    	;

    Types
    	: Type
    	| Types ',' Type
    	;

    TypeParameters_opt
    	: /* empty */
    	| '(' TypeParameters ')'
    	;

    TypeParameters
    	: ID
    	| TypeParameters ',' ID
    	;

    Interface
    	: '{' MemberDeclarations_opt '}'
    	;

    MemberDeclarations_opt
    	: /* empty */
    	| MemberDeclarations_opt MemberDeclaration
    	;

    MemberDeclaration
    	: ID Typing Initialization_opt ';'
    	| 'method' Operator Typing ';'
    	;

    Initialization_opt
    	: /* empty */
    	| '=' Expression
    	;

    Implementation_opt
    	: /* empty */
    	| '{' Definitions_opt '}'
    	;

    Definitions_opt
    	: /* empty */
    	| Definitions_opt Definition ';'
    	;

    Definition
    	: Operator FunctionParameters_opt Typing_opt '=' Expression
    	;

    FunctionParameters_opt
    	: /* empty */
    	| FunctionParameters
    	;

    FunctionParameters
    	: '(' Parameters_opt ')'
    	;

    Parameters_opt
    	: /* empty */
    	| Parameters
    	;

    Parameters
    	: Parameter
    	| Parameters ',' Parameter
    	;

    Parameter
    	: ID Typing_opt
    	;

    Expression_opt
    	: /* empty */
    	| Expression
    	;

    Expression
    	: UntypedExpression Typing_opt
    	| Allocation
    	| Expression 'as' Type
    	| '$' Expression
    	| '(' Expression_opt ')'
    	;

    Allocation
    	: 'new' Type Dimensions_opt
    	| 'new' Type Dimensions '=' Expression
    	;

    Dimensions_opt
    	: /* empty */
    	| Dimensions
    	;

    Dimensions
    	: Dimension
    	| Dimensions Dimension
    	;

    Dimension
    	: '[' UntypedExpression ']'
    	;

    UntypedExpression
    	: Literal
    	| CollectionKind '{' Expressions_opt '}'
    	| TupleExpression
    	| Expression '!' Expression
    	| '#[' ArrayExtension ']#'
    	| ArraySlotExpression
    	| OperatorExpression
    	| 'function' FunctionParameters Expression
    	| Expression Arguments
    	| 'return' Expression_opt
    	| 'if' UntypedExpression 'then' Expression 'else' Expression
    	| 'while' UntypedExpression 'do' Expression
    	| 'let' Locals 'in' Expression
    	| Location '=' Expression
    	| Expression '.' Member
    	| Sequence
    	| '(' UntypedExpression ')'
    	| Comprehension
    	| 'foreach' '(' Qualifiers_opt ')' Expression_opt
    	| 'hom' '(' Expression ',' Expression ',' Expression ',' Expression ')'
    	;

    Literal
    	: INT
    	| CHAR
    	| REAL
    	| STRING
    	| 'true'
    	| 'false'
    	| 'null'
    	;

    TupleExpression
    	: '<' TupleComponents '>'
    	| TupleProjection
    	;

    TupleComponents
    	: Expressions_opt
    	| NamedTupleComponents
    	;

    NamedTupleComponents
    	: NamedTupleComponent
    	| NamedTupleComponents ',' NamedTupleComponent
    	;

    NamedTupleComponent
    	: ID ':=' Expression
    	;

    TupleProjection
    	: UntypedExpression '@' TupleSelector
    	;

    TupleSelector
    	: INT
    	| ID
    	;

    ArrayExtension
    	: Expressions
    	| IndexedExpressions
    	;

    IndexedExpressions
    	: IndexedExpression
    	| IndexedExpressions ',' IndexedExpression
    	;

    IndexedExpression
    	: UntypedExpression ':' Expression
    	;

    ArraySlotExpression
    	: Expression '[' Expression ']'
    	;

    OperatorExpression
    	: Operator
    	| OPERATOR_ Expression
    	| Expression _OPERATOR
    	| Expression _OPERATOR_ Expression
    	;

    Arguments
    	: '(' Expressions_opt ')'
    	;

    Expressions_opt
    	: /* empty */
    	| Expressions
    	;

    Expressions
    	: Expression
    	| Expressions ',' Expression
    	;

    Locals
    	: Local ';'
    	| Locals Local ';'
    	;

    Local
    	: Parameter Initialization_opt
    	;

    Location
    	: ID
    	| TupleProjection
    	| ArraySlotExpression
    	| Expression '.' ID
    	;

    Member
    	: ID
    	| Operator Arguments
    	;

    Sequence
    	: '{' ExpressionSequence_opt '}'
    	;

    ExpressionSequence_opt
    	: /* empty */
    	| Expression ';'
    	| ExpressionSequence_opt Expression ';'
    	;

    Comprehension
    	: Monoid '{' Expression '|' Qualifiers_opt '}'
    	;

    Monoid
    	: '[' Expression ',' Expression ']' InPlace_opt
    	;

    InPlace_opt
    	: /* empty */
    	| '<'
    	| '>'
    	;

    Qualifiers_opt
    	: /* empty */
    	| Qualifiers
    	;

    Qualifiers
    	: Qualifier
    	| Qualifiers ',' Qualifier
    	;

    Qualifier
    	: Expression
    	| Expression '<-' Expression
    	;

    Operator
    	: OPERATOR_
    	| _OPERATOR_
    	| _OPERATOR
    	| ID
    	;

Copyright © 2013 by Hassan Aït-Kaci; All Rights Reserved.