Reference

flx_grammar(1)

NAME

Felix grammar summary.

Grammar

compilation_unit:

| statement_aster ENDMARKER

expression:

| expr ENDMARKER

statement_aster:

| statement statement_aster

| /* empty */

statement:

| binding_definition

| declarative

| executable

| inclusion

| directive

| publish

| comment

| null_statement

comment:

| COMMENT_KEYWORD STRING SEMI

binding_definition:

| abstract_type

| const_def

| binding_header

| export_statement

publish:

| PUBLISH STRING binding_definition

| PUBLISH STRING declarative

| PRIVATE declarative

| PRIVATE binding_definition

declarative:

| function_definition

| object_definition

| procedure_definition

| module_definition

| union_decl

| struct_decl

| type_alias

directive:

| open_decl

| use_decl

| regdef

| glr_production

| macro_definition

executable:

| var_def

| val_def

| call

| svc

| return

| ifgoto_stmt

| whilst_stmt

| todo

| assignment

| inline_cpp

| goto_statement

| label_statement

| assert_statement

null_statement:

| SEMI

inclusion:

| INCLUDE STRING SEMI

regdef:

| REGEXP NAME EQUAL re1 SEMI

re0:

| re1 AS NAME

| re1

re1:

| re1 VBAR re2

| re2

re2:

| re2 re3

| re3

re3:

| re4 STAR

| re4 PLUS

| re4 QUEST

| re4

re4:

| STRING

| UNDERSCORE

| DOT

| LPAR re0 RPAR

| LSQB charset RSQB

| LSQB CIRCUMFLEX charset RSQB

| re_name

re_name:

| re_name COLONCOLON NAME

| NAME

charset0:

| INTEGER MINUS INTEGER

| STRING MINUS STRING

| STRING

| INTEGER

charset:

| charset charset0

| charset0

tvar:

| NAME

| NAME COLON tpattern

tvar_comma_list:

| tvar COMMA tvar_comma_list

| tvar

| /* empty */

tvarlist:

| LSQB tvar_comma_list RSQB

| /* empty */

type_qual:

| INCOMPLETE

| POD

| GC_POINTER

type_quals:

| type_qual type_quals

| /* empty */

abstract_type:

| type_quals CTYPES basic_name_comma_list requires_clause SEMI

| type_quals TYPE NAME tvarlist EQUAL code_spec requires_clause SEMI

union_decl:

| ENUM NAME LBRACE enum_items RBRACE SEMI

| UNION NAME tvarlist EQUAL type_sum_items SEMI

| UNION NAME tvarlist EQUAL VBAR type_sum_items SEMI

enum_items:

| enum_items COMMA enum_item

| enum_item

enum_item:

| NAME

type_sum_items:

| type_sum_items VBAR type_sum_item

| type_sum_item

type_sum_item:

| NAME OF expr

| NAME

opt_equal:

| EQUAL

| /* empty */

struct_decl:

| STRUCT NAME tvarlist opt_equal LBRACE struct_component_aster RBRACE

| CSTRUCT NAME tvarlist opt_equal LBRACE struct_component_aster RBRACE

| CCLASS NAME tvarlist opt_equal LBRACE class_component_aster RBRACE

struct_component_aster:

| struct_component struct_component_aster

| /* empty */

struct_component:

| NAME COLON expr SEMI

opt_name:

| NAME

| /* empty */

class_component_aster:

| class_component class_component_aster

| /* empty */

class_component:

| VAR NAME COLON expr SEMI

| VAL NAME COLON expr SEMI

| FUNCTION NAME COLON expr opt_cstring SEMI

| PROCEDURE NAME COLON expr opt_cstring SEMI

| CTOR opt_name COLON expr opt_cstring SEMI

const_def:

| CONST NAME tvarlist COLON expr EQUAL code_spec requires_clause SEMI

| CONST NAME tvarlist COLON expr requires_clause SEMI

code_spec:

| STRING

| CSTRING

requirement:

| qualified_name

| BODY code_spec

| HEADER code_spec

| PROPERTY STRING

requirements:

| requirement COMMA requirements

| requirement

requires_clause:

| REQUIRES requirements

| /* empty */

binding_header:

| HEADER code_spec requires_clause SEMI

| BODY code_spec requires_clause SEMI

| HEADER EQUAL code_spec requires_clause SEMI

| BODY EQUAL code_spec requires_clause SEMI

| HEADER NAME tvarlist EQUAL code_spec requires_clause SEMI

| BODY NAME tvarlist EQUAL code_spec requires_clause SEMI

| REQUIRES requirements SEMI

| NAME REQUIRES requirements SEMI

inline_cpp:

| CODE code_spec SEMI

| NORETURN CODE code_spec SEMI

type_alias:

| TYPEDEF NAME tvarlist EQUAL expr SEMI

| TYPEDEF FUNCTION NAME tvarlist fun_args COLON expr EQRIGHTARROW expr SEMI

| TYPEDEF FUNCTION NAME tvarlist COLON expr EQUAL type_matchings SEMI

| RENAME NAME tvarlist EQUAL qualified_name SEMI

| RENAME FUNCTION NAME tvarlist EQUAL qualified_name SEMI

| INHERIT qualified_name SEMI

export_statement:

| EXPORT FUNCTION suffixed_name AS STRING SEMI

| EXPORT PROCEDURE suffixed_name AS STRING SEMI

| EXPORT TYPE LPAR expr RPAR AS STRING SEMI

open_decl:

| OPEN qualified_name SEMI

use_decl:

| USE qualified_name SEMI

| USE NAME EQUAL qualified_name SEMI

mac_arg:

| NAME COLON FUNCTION

| NAME COLON PROCEDURE

| NAME COLON NAME

| NAME

mac_args:

| mac_arg COMMA mac_args

| mac_arg

mac_arg_list:

| LPAR mac_args RPAR

| LPAR RPAR

macro_definition:

| MACRO NAME IS expr SEMI

| MACRO FOR NAME IN expr DO statement_aster DONE SEMI
/*

| MACRO NAME COLON LIST IDENT EQUAL rev_name_list SEMI
*/

| MACRO NAME IS NEW SEMI

| MACRO VAR NAME EQUAL expr SEMI

| MACRO NAME EQUAL expr SEMI

| MACRO VAL NAME EQUAL expr SEMI

| MACRO VAL NAME IS tuple SEMI

| MACRO FUNCTION NAME mac_arg_list EQUAL expr SEMI

| MACRO PROCEDURE NAME mac_arg_list compound

| MACRO FORGET macro_names SEMI

| MACRO GOTO NAME SEMI

| MACRO NAME COLONGREATER

| MACRO IF expr GOTO NAME SEMI

| MACRO FOR VAL NAME IN tuple DO statement_aster DONE SEMI

macro_name_list:

| macro_name_list NAME

| NAME

macro_names:

| macro_name_list

| /* empty */
/*

rev_name_list:

| NAME COMMA rev_name_list

| NAME
*/

fun_arg:

| LPAR parameter_comma_list WHEN expr RPAR

| LPAR parameter_comma_list RPAR

| NAME

fun_args:

| fun_arg fun_args

| fun_arg

opt_fun_args:

| fun_args

| /* empty */

opt_type_expr:

| COLON expr EXPECT expr

| COLON expr

| EXPECT expr

| /* empty */

opt_cstring:

| EQUAL code_spec

| /* empty */

adjective:

| INLINE

| NOINLINE

adjectives:

| adjective adjectives

| /* empty */

opt_prec:

| IS NAME

| /* empty */

opt_traint_eq:

| EXPECT expr EQUAL

| /* empty */

function_definition:

| adjectives FUNCTION NAME tvarlist fun_args opt_type_expr EQRIGHTARROW expr SEMI

| adjectives FUNCTION NAME tvarlist fun_args opt_type_expr EQUAL compound

| adjectives FUNCTION NAME tvarlist COLON expr opt_cstring opt_prec requires_clause SEMI

| adjectives FUNCTION NAME tvarlist COLON expr EQUAL matchings SEMI

procedure_definition:

| PROCEDURE NAME tvarlist opt_fun_args opt_traint_eq compound

| adjective PROCEDURE NAME tvarlist fun_args opt_traint_eq compound

| PROCEDURE NAME tvarlist COLON expr opt_cstring requires_clause SEMI

object_definition:

| OBJECT NAME tvarlist fun_args compound

parameter_comma_list:

| parameter COMMA parameter_comma_list

| parameter

| /* empty */

parameter:

| NAME COLON arrow

| NAME

| VAR NAME COLON arrow

| VAR NAME

assert_statement:

| ASSERT expr SEMI

goto_statement:

| GOTO NAME SEMI

label_statement:

| NAME COLONGREATER

svc:

| SVC NAME SEMI

module_definition:

| MODULE NAME tvarlist compound

var_def:

| VAR NAME tvarlist EQUAL expr SEMI

| VAR NAME tvarlist COLON expr LEFTARROW expr SEMI

| VAR AMPER NAME tvarlist COLON expr LEFTARROW expr SEMI

| VAR NAME tvarlist COLON expr EQUAL expr SEMI

| VAR NAME tvarlist COLON expr SEMI

val_def:

| VAL NAME tvarlist EQUAL expr SEMI

| VAL NAME tvarlist COLON expr EQUAL expr SEMI

| VAL NAME tvarlist COLON expr SEMI

return:

| RETURN expr SEMI

| RETURN SEMI

compound:

| LBRACE statement_aster RBRACE

call:

| expr SEMI

| CALL expr SEMI

| JUMP expr SEMI

| LOOP expr SEMI

assignop:

| EQUAL

| COLONEQUAL

rmwop:

| PLUSEQUAL

| MINUSEQUAL

| STAREQUAL

| SLASHEQUAL

| PERCENTEQUAL

| LEFTSHIFTEQUAL

| RIGHTSHIFTEQUAL

| CARETEQUAL

| VBAREQUAL

| AMPEREQUAL

| TILDEEQUAL

swapop:

| LEFTRIGHTARROW

incrop:

| PLUSPLUS

| MINUSMINUS

lelement:

| VAL NAME

| VAR NAME

| NAME

| UNDERSCORE

| LPAR lexprs RPAR

tlelement:

| lelement COLON factor

| lelement

lexprs:

| tlelement COMMA lexprs

| tlelement

lexpr:

| lexprs

assignment:

| expr LEFTARROW expr SEMI

| expr swapop expr SEMI

| DEF lexpr EQUAL expr SEMI

| expr assignop expr SEMI

| expr rmwop expr SEMI

| expr incrop SEMI

| incrop expr SEMI

todo:

| TODO STRING SEMI

| TODO SEMI

elif_clause:

| ELIF expr DO statement_aster

| ELIF expr RETURN SEMI

| ELIF expr GOTO NAME SEMI

elif_clauses:

| elif_clauses elif_clause

| elif_clause

else_clause:

| elif_clauses ELSE statement_aster

| ELSE statement_aster

ifgoto_stmt:

| IF expr GOTO NAME SEMI

| IF expr RETURN SEMI

| IF expr DO statement_aster else_clause DONE SEMI

| IF expr DO statement_aster DONE SEMI

whilst_stmt:

| WHILST expr DO statement_aster DONE SEMI

| UNTIL expr DO statement_aster DONE SEMI

regmatch_expr:

| REGMATCH expr WITH regmatch_alternatives ENDMATCH

| REGLEX expr TO expr WITH regmatch_alternatives ENDMATCH

regmatch_alternatives:

| regmatch_alternatives regmatch_alternative

| regmatch_alternative

regmatch_alternative:

| VBAR re1 EQRIGHTARROW expr

match_expr:

| MATCH expr WITH matchings ENDMATCH

matchings:

| matching matchings

| matching

matching:

| VBAR pattern EQRIGHTARROW expr

| VBAR EQRIGHTARROW expr

pattern:

| as_pattern WHEN expr

| as_pattern

as_pattern:

| variant_pattern AS NAME

| variant_pattern

variant_pattern:

| tuple_pattern

tuple_pattern:

| coercive_pattern_list

coercive_pattern_list:

| coercive_pattern COMMA coercive_pattern_list

| coercive_pattern

coercive_pattern:

| atomic_pattern COLON arrow

| atomic_pattern

atomic_pattern:
/* constants */

| STRING

| integral

| NAN
/* ranges */

| STRING DOTDOT STRING

| integral DOTDOT integral

| floating DOTDOT floating
/* other */

| ctor_pattern
/*

| QUEST NAME
*/

| QUEST NAME

| QUEST

| UNDERSCORE

| LPAR pattern RPAR

| REGEXP STRING LPAR basic_name_comma_list RPAR

ctor_pattern:

| ctor_name atomic_pattern

| ctor_name

ctor_name:

| simple_name_parts

| CASE INTEGER

integral:

| INTEGER

| MINUS INTEGER

floating:

| FLOAT

| MINUS FLOAT

| INF

| MINUS INF

basic_name:

| NAME

basic_name_comma_list:

| basic_name COMMA basic_name_comma_list

| basic_name

| /* empty */

tpattern_comma_list:

| tpattern COMMA tpattern_comma_list

| tpattern

| /* empty */

tuple_tpattern:

| tpattern_comma_list

tpattern:

| tpattern AS NAME

| tpat0

tpat0:

| tpat1 RIGHTARROW tpat0

| tpat1

tpat1:

| sumpat

sumpat:

| tpat2 PLUS sumpat

| tpat2

tpat2:

| mulpat

mulpat:

| tpat3 STAR mulpat

| tpat3

tpat3:

| NAME tpatlist

| LPAR tuple_tpattern RPAR

| QUEST NAME

| QUEST

| UNDERSCORE

| INTEGER

tpatlist:

| LSQB tpattern_comma_list RSQB

| /* empty */

type_match_expr:

| TYPEMATCH expr WITH type_matchings ENDMATCH

type_matchings:

| type_matching type_matchings

| type_matching

type_matching:

| VBAR tuple_tpattern EQRIGHTARROW expr

glr_term:

| qualified_name
/* | LSQB glr_alts RSQB */

| LBRACE glr_alternatives RBRACE

| LPAR glr_alternatives RPAR

| glr_term QUEST

| glr_term STAR

| glr_term PLUS

glr_alternatives:

| glr_sequence VBAR glr_alts

| glr_sequence

glr_alts:

| glr_sequence VBAR glr_alts

| glr_sequence

glr_sequence:

| glr_term glr_seqs

| glr_term

glr_seqs:

| glr_term glr_seqs

| glr_term

glr_entry:

| NAME COLON glr_term

| glr_term

glr_entries:

| glr_entry glr_entries

| glr_entry

glr_matching:

| VBAR glr_entries EQRIGHTARROW expr

| VBAR EQRIGHTARROW expr

glr_matchings:

| glr_matching glr_matchings

| glr_matching

glr_production:

| NONTERM NAME COLON expr EQUAL glr_matchings SEMI

glr_parse:

| PARSE expr WITH glr_matchings ENDMATCH

expr:

| LET pattern EQUAL expr IN expr

| rvalue

rvalue:

| lambda
/* cannot use fun_args, since ambiguity on the third case (NAME) */

lambda_fun_arg:

| LPAR parameter_comma_list WHEN expr RPAR

| LPAR parameter_comma_list RPAR

lambda_fun_args:

| lambda_fun_arg lambda_fun_args

| lambda_fun_arg

lambda:

| dollar_apply

| adjectives FUNCTION lambda_fun_args opt_type_expr EQUAL compound

| adjectives FUNCTION lambda_fun_args opt_type_expr EQRIGHTARROW expr

| PROCEDURE lambda_fun_args compound

| PROCEDURE compound

dollar_apply:

| tuple DOLLAR dollar_apply

| tuple

tuple:

| or_condition tuple_suffix

| or_condition

tuple_suffix:

| COMMA or_condition tuple_suffix

| COMMA or_condition

/*orop:

| OR

or_condition:

| or_condition orop and_condition

| and_condition
*/
/* oring formation is 'psuedo-associative' */

or_condition:

| and_condition OR or_list

| and_condition

or_list:

| and_condition OR or_list

| and_condition
/* oring formation is 'psuedo-associative' */

and_condition:

| not_condition AND and_list

| not_condition

and_list:

| not_condition AND and_list

| not_condition
/*

andop:

| AND

and_condition:

| and_condition andop not_condition

| not_condition
*/

notop:

| NOT

not_condition:

| notop not_condition

| comparison

chain_cmp_op:

| ANDEQEQUAL

| ANDNOTEQUAL

| ANDLESS

| ANDGREATER

| ANDLESSEQUAL

| ANDGREATEREQUAL

cmp_item:

| chain_cmp_op sum

cmp_item_list:

| cmp_item cmp_item_list

| cmp_item

cmp_op:

| EQEQUAL

| NOTEQUAL

| LESS

| GREATER

| LESSEQUAL

| GREATEREQUAL

| ISIN
/* hack */

comparison:

| sum cmp_op sum cmp_item_list

| sum cmp_op sum

| as_expr

as_expr:

| as_expr AS NAME

| setunion

setunion:

| user10 VBARVBAR setunion_list

| user10

setunion_list:

| user10 VBARVBAR setunion_list

| user10

user10:

| user10 USER10 setintersection

| setintersection

setintersection:

| arrow AMPERAMPER setintersection_list

| arrow

setintersection_list:

| arrow AMPERAMPER setintersection_list

| arrow

arrow:

| case_literal RIGHTARROW arrow

| case_literal

case_literal:

| CASE INTEGER

| CASE INTEGER OF sum

| bor

bor:

| bor SLOSHVBAR bxor

| bxor

bxor:

| bxor SLOSHCIRCUMFLEX band

| band

band:

| band SLOSHAMPER shift

| shift

shift:

| shift LEFTSHIFT sum

| shift RIGHTSHIFT sum

| sum
/* sum formation is 'psuedo-associative' */

sum:

| subtraction PLUS sum_list

| subtraction

sum_list:

| subtraction PLUS sum_list

| subtraction

subtraction:

| subtraction MINUS product

| product
/* product formation is 'psuedo-associative' */

product:

| term STAR product_list

| term

product_list:

| term STAR product_list

| term
/* division is left associative: note higher precedence
the product, so that
a * b/c * d -> a * (b/c) * d
*/

term:

| term SLASH power

| term PERCENT power

| prefixed
/* note weird recursion here: we need to support
-x ** -x = -(x**(-x))
*/

prefixed:

| LVAL power

| PLUS power

| MINUS power

| TILDE power

| power
/* exponentiation is right associative */

power:

| superscript STARSTAR prefixed

| superscript

superscript:

| superscript CIRCUMFLEX refr

| refr

refr:

| AMPER refr

| STAR refr

| application
/* applications is left associative */

application:

| application coercion
/*

| MAP coercion coercion
*/

| CASENO coercion

| coercion

coercion:

| coercion COLON factor

| suffixed_name

| factor

factor:

| dollar_name

| factor DOT LSQB expr RSQB

| factor DOT LSQB expr TO expr RSQB

| factor DOT LSQB expr TO RSQB

| factor DOT LSQB TO expr RSQB

| factor DOT NAME

| factor DOT LPAR INTEGER RPAR

dollar_name:

| NOEXPAND qualified_name

| THE qualified_name

| qualified_name

| atom

qualified_name:

| qualified_name COLONCOLON simple_name_parts

| simple_name_parts

elif:

| ELIF expr THEN expr

elifs:

| elifs elif

| elif

else_part:

| elifs ELSE expr

| ELSE expr

cond:

| IF expr THEN expr else_part ENDIF

expr_code_prefix:

| CODE LSQB expr RSQB

atom:

| DOTDOTDOT

| type_match_expr

| expr_code_prefix NAME

| expr_code_prefix STRING

| LSQBAR expr RSQBAR

| LBRACE expr RBRACE

| glr_parse

| match_expr

| regmatch_expr

| compound

| LPAR expr RPAR

| LPAR RPAR

| literal

| cond

| USERLB expr USERRB

literal:

| INTEGER

| FLOAT

| STRING

| CSTRING

simple_name_parts:

| NAME LSQB expr RSQB

| NAME

suffixed_name:

| qualified_name OF LPAR expr RPAR

VERSION

1.1.1_rc1

SEE ALSO

felix(1) for a language introduction and man page index
flx(1) for a list of the tools.
flxcc(1) for a description of the wrapper generator tool.
flx_lit(1) for a description of literals
flx_op(1) for a list of operators
flx_cop(1) for a list of C operator precedence names
flx_key(1) for a list of keywords
flx_grammar(1) for a grammar summary
flx_lib_typ(1) for a list of library types
flx_dir(1) for a list of directives
flx_exec(1) for a list of executable statements
flx_decl(1) for a list of declarative statements
flx_bind(1) for a list of binding statements

WEB SITE

See http://felix.sourceforge.net

AUTHOR

John Maxwell Skaller, mailto:[email protected]