FELIX GRAMMAR

Return to Main Contents
 

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:skaller@users.sourceforge.net


 

Index

NAME
Grammar
VERSION
SEE ALSO
WEB SITE
AUTHOR

This document was created by man2html, using the manual pages.
Time: 07:02:36 GMT, May 31, 2006