Jancy Grammar Reference

The present page provides the full Jancy grammar for reference purposes.

This listing is auto-generated from .llk files by Graco parser generator, and is basically the very same grammar being used by the Jancy compiler. All the actions, rule attributes and rule arguments removed for readability.

Non-terminals are named using lower-case C-style naming convention (e.g. global_declaration); character terminals are denoted as C char literals (e.g. ';'); non-char terminals have names starting with TokenKind_ prefix (e.g. TokenKind_Identifier).

Grammar Listing

compilation_unit
	::=	(import_declaration | global_declaration)*

compilation_unit_sync
	::=	TokenKind_Import
	|	global_declaration_sync

import_declaration
	::=	TokenKind_Import TokenKind_Literal

global_declaration
	::=	common_declaration
	|	namespace_declaration
	|	extension_declaration
	|	global_item_declaration
	|	';'

global_declaration_sync
	::=	common_declaration_sync
	|	declaration_specifier_sync
	|	special_void_method_declarator_sync
	|	TokenKind_Namespace
	|	TokenKind_Extension
	|	';'

qualified_name
	::=	(TokenKind_BaseType | TokenKind_Identifier) ('.' TokenKind_Identifier | '<' template_inst_type_name_list '>')*

template_inst_type_name_list
	::=	type_name (',' type_name_or_empty)*
	|	',' type_name_or_empty (',' type_name_or_empty)*
	|	epsilon

qualified_name_rslv
	::=	(TokenKind_BaseType | TokenKind_Identifier) ('.' TokenKind_Identifier | template_instantiate_operator_pass1_rslv)*

template_instantiate_operator_pass1_rslv
	::=	'<' template_instantiate_operator_pass1_rslv_item* '>'

qualified_name_pass1
	::=	qualified_name_pass1_atom ('.' qualified_name_pass1_atom)*

qualified_name_pass1_atom
	::=	TokenKind_BaseType
	|	TokenKind_Identifier template_instantiate_operator_pass1?

template_instantiate_operator_pass1
	::=	'<' template_instantiate_operator_pass1_item* '>'

qualified_name_save
	::=	qualified_name_pass1

qualified_name_list
	::=	qualified_name_pass1 (',' qualified_name_pass1)*

qualified_type_name_rslv
	::=	qualified_name_rslv (',' | ';' | '=' | '(' | '[' | '{' | TokenKind_Body)?
	|	qualified_name_pass1

qualified_type_name
	::=	qualified_name_pass1
	|	qualified_name

type_name_rslv
	::=	type_specifier_sync
	|	type_modifier_sync
	|	qualified_type_name_rslv

type_specifier_sync
	::=	TokenKind_Void
	|	TokenKind_Class
	|	TokenKind_AnyData
	|	TokenKind_Bool
	|	TokenKind_Int
	|	TokenKind_IntPtr
	|	TokenKind_Char
	|	TokenKind_Short
	|	TokenKind_Long
	|	TokenKind_Float
	|	TokenKind_Double

type_modifier_sync
	::=	TokenKind_Unsigned
	|	TokenKind_BigEndian
	|	TokenKind_Const
	|	TokenKind_MaybeConst
	|	TokenKind_ConstIf
	|	TokenKind_ReadOnly
	|	TokenKind_Volatile
	|	TokenKind_Weak
	|	TokenKind_Thin
	|	TokenKind_Safe
	|	TokenKind_Unsafe
	|	TokenKind_Cdecl
	|	TokenKind_Stdcall
	|	TokenKind_Thiscall
	|	TokenKind_Jnccall
	|	TokenKind_Array
	|	TokenKind_Function
	|	TokenKind_Property
	|	TokenKind_Bindable
	|	TokenKind_AutoGet
	|	TokenKind_Indexed
	|	TokenKind_Multicast
	|	TokenKind_Event
	|	TokenKind_Reactor
	|	TokenKind_ErrorCode
	|	TokenKind_Async

type_name
	::=	type_name_impl

type_name_impl
	::=	type_name_declarator

type_name_or_empty
	::=	type_name_impl
	|	epsilon

type_name_no_suffix
	::=	declaration_specifier_list declarator_prefix*

declaration_specifier_list
	::=	declaration_specifier+

declarator_prefix
	::=	'*' type_modifier*

type_name_declarator
	::=	declaration_specifier_list declarator_prefix* declarator_suffix*

declarator_suffix
	::=	array_suffix
	|	function_suffix
	|	this_modifier_suffix
	|	bitfield_suffix

type_name_list
	::=	type_name (',' type_name)*

template_type_name_list
	::=	type_name_declarator (',' type_name_declarator)*

template_inst_type_name_list_save
	::=	template_inst_type_name_list

doxy_comment
	::=	TokenKind_DoxyComment1
	|	TokenKind_DoxyComment2
	|	TokenKind_DoxyComment3
	|	TokenKind_DoxyComment4

common_declaration
	::=	using_declaration
	|	pragma_declaration
	|	named_type_specifier
	|	attribute_block

using_declaration
	::=	TokenKind_Using using_namespace_kind? qualified_name_list ';'

pragma_declaration
	::=	TokenKind_Pragma '(' TokenKind_Identifier (',' (constant_integer_expr | TokenKind_Default) | ) ')'

named_type_specifier
	::=	enum_specifier
	|	struct_specifier
	|	union_specifier
	|	class_specifier
	|	opaque_class_specifier
	|	library_specifier

attribute_block
	::=	'[' attribute_declarator (',' attribute_declarator)* ']'

common_declaration_sync
	::=	TokenKind_Using
	|	TokenKind_Pragma
	|	named_type_specifier_sync
	|	'['

named_type_specifier_sync
	::=	TokenKind_Enum
	|	TokenKind_BitFlagEnum
	|	TokenKind_Struct
	|	TokenKind_Union
	|	TokenKind_Class
	|	TokenKind_OpaqueClass
	|	TokenKind_DynamicLib

namespace_declaration
	::=	TokenKind_Namespace qualified_name_pass1 TokenKind_Body

extension_declaration
	::=	TokenKind_Extension TokenKind_Identifier ':' type_name TokenKind_Body

global_item_declaration
	::=	normal_item_declaration
	|	special_void_method_declarator
	|	declarator_list

declaration_specifier_sync
	::=	storage_specifier_sync
	|	access_specifier_sync
	|	type_specifier_sync
	|	type_modifier_sync

special_void_method_declarator_sync
	::=	TokenKind_Construct
	|	TokenKind_StaticConstruct
	|	TokenKind_Destruct
	|	TokenKind_Set
	|	TokenKind_Operator

member_block_declaration
	::=	common_declaration
	|	friend_declaration
	|	access_declaration
	|	member_item_declaration
	|	';'

friend_declaration
	::=	TokenKind_Friend qualified_name_list ';'

access_declaration
	::=	access_specifier ':'

member_item_declaration
	::=	normal_item_declaration
	|	special_void_method_declarator

member_block_declaration_sync
	::=	common_declaration_sync
	|	declaration_specifier_sync
	|	special_void_method_declarator_sync
	|	TokenKind_Friend
	|	TokenKind_Public
	|	TokenKind_Protected
	|	';'

local_declaration
	::=	common_declaration
	|	local_item_declaration
	|	statement
	|	catch_label
	|	finally_label
	|	nested_scope_label

local_item_declaration
	::=	normal_item_declaration

statement
	::=	compound_stmt
	|	if_stmt
	|	switch_stmt
	|	regex_switch_stmt
	|	while_stmt
	|	do_stmt
	|	for_stmt
	|	break_stmt
	|	continue_stmt
	|	return_stmt
	|	once_stmt
	|	try_stmt
	|	throw_stmt
	|	unsafe_stmt
	|	assert_stmt
	|	dynamic_layout_stmt
	|	dynamic_group_stmt
	|	onevent_stmt
	|	reactive_expression ';'
	|	';'

catch_label
	::=	TokenKind_Catch ':'

finally_label
	::=	TokenKind_Finally ':'

nested_scope_label
	::=	TokenKind_NestedScope ':'

local_branch_declaration
	::=	attribute_block? (statement | local_item_declaration)

local_declaration_sync
	::=	common_declaration_sync
	|	declaration_specifier_sync
	|	statement_sync
	|	TokenKind_Catch
	|	TokenKind_Finally
	|	TokenKind_NestedScope

statement_sync
	::=	TokenKind_If
	|	TokenKind_Switch
	|	TokenKind_While
	|	TokenKind_Do
	|	TokenKind_For
	|	TokenKind_Break
	|	TokenKind_Continue
	|	TokenKind_Return
	|	TokenKind_Once
	|	TokenKind_Try
	|	TokenKind_Throw
	|	TokenKind_Unsafe
	|	TokenKind_Assert
	|	TokenKind_DynamicLayout
	|	TokenKind_OnEvent
	|	';'
	|	'{'

global_declaration_list
	::=	global_declaration*

member_block_declaration_list
	::=	member_block_declaration*

local_declaration_list
	::=	local_declaration*

using_namespace_kind
	::=	TokenKind_Namespace
	|	TokenKind_Extension

access_specifier
	::=	TokenKind_Public
	|	TokenKind_Protected

constant_integer_expr
	::=	expression

normal_item_declaration
	::=	declaration_specifier_list declarator_list

special_void_method_declarator
	::=	special_void_method_declarator_qualifier function_suffix this_modifier_suffix* special_void_method_declarator_terminator

qualified_special_void_method_declaration_rslv
	::=	(TokenKind_Identifier '.')* special_void_method_declarator_sync

declarator_list
	::=	declarator declarator_list_terminator

attribute_declarator
	::=	TokenKind_Identifier ('=' expression_pass1)?
	|	'@' qualified_name_pass1
	|	epsilon

expression_pass1
	::=	expression_pass1_item+

declaration_specifier
	::=	storage_specifier
	|	access_specifier
	|	type_specifier
	|	type_modifier

storage_specifier
	::=	TokenKind_Typedef
	|	TokenKind_Alias
	|	TokenKind_Static
	|	TokenKind_ThreadLocal
	|	TokenKind_Abstract
	|	TokenKind_Virtual
	|	TokenKind_Override
	|	TokenKind_Mutable
	|	TokenKind_Disposable
	|	TokenKind_DynamicField

type_specifier
	::=	TokenKind_Void
	|	TokenKind_Class
	|	TokenKind_AnyData
	|	TokenKind_Bool
	|	TokenKind_Int
	|	TokenKind_IntPtr
	|	TokenKind_Char
	|	TokenKind_Short
	|	TokenKind_Long
	|	TokenKind_Float
	|	TokenKind_Double
	|	property_template_specifier
	|	qualified_type_name

type_modifier
	::=	TokenKind_Unsigned
	|	TokenKind_BigEndian
	|	TokenKind_Const
	|	TokenKind_MaybeConst
	|	TokenKind_ConstIf
	|	TokenKind_ReadOnly
	|	TokenKind_Volatile
	|	TokenKind_Weak
	|	TokenKind_Thin
	|	TokenKind_Safe
	|	TokenKind_Unsafe
	|	TokenKind_Cdecl
	|	TokenKind_Stdcall
	|	TokenKind_Thiscall
	|	TokenKind_Jnccall
	|	TokenKind_Array
	|	TokenKind_Function
	|	TokenKind_Property
	|	TokenKind_Bindable
	|	TokenKind_AutoGet
	|	TokenKind_Indexed
	|	TokenKind_Multicast
	|	TokenKind_Event
	|	TokenKind_Reactor
	|	TokenKind_ErrorCode
	|	TokenKind_Async

storage_specifier_sync
	::=	TokenKind_Typedef
	|	TokenKind_Alias
	|	TokenKind_Static
	|	TokenKind_ThreadLocal
	|	TokenKind_Abstract
	|	TokenKind_Virtual
	|	TokenKind_Override
	|	TokenKind_Mutable
	|	TokenKind_Disposable
	|	TokenKind_DynamicField

access_specifier_sync
	::=	TokenKind_Public
	|	TokenKind_Protected

type_specifier_modifier_list
	::=	type_specifier_modifier+

type_specifier_modifier
	::=	type_specifier
	|	type_modifier

property_template_specifier
	::=	TokenKind_Property '{' member_block_declaration_list '}'

declarator
	::=	declarator_prefix* declarator_name declarator_suffix* declarator_constructor?

declarator_list_terminator
	::=	declarator_w_curly_initializer
	|	declarator_wo_curly_initializer
	|	TokenKind_Body

declarator_name
	::=	declarator_qualifier ('.' declarator_qualifier)*

declarator_constructor
	::=	TokenKind_Construct? arg_list_pass1

special_void_method_declarator_qualifier
	::=	TokenKind_Construct
	|	TokenKind_StaticConstruct
	|	TokenKind_Destruct
	|	TokenKind_Set
	|	TokenKind_Operator operator_declarator_qualifier
	|	TokenKind_PostfixOperator postfix_operator_declarator_qualifier

function_suffix
	::=	'(' function_formal_argument_list? ')'

this_modifier_suffix
	::=	TokenKind_Const
	|	TokenKind_MaybeConst
	|	TokenKind_Thin

special_void_method_declarator_terminator
	::=	';'
	|	TokenKind_Body

declarator_w_curly_initializer
	::=	'=' curly_initializer_pass1 (',' declarator_list)?

declarator_wo_curly_initializer
	::=	('=' expression_pass1)? (',' declarator_list | ';')

curly_initializer_pass1
	::=	TokenKind_Body
	|	curly_initializer_pass1_impl

declarator_qualifier
	::=	TokenKind_Identifier template_decl_suffix?
	|	TokenKind_Get
	|	special_void_method_declarator_qualifier

template_decl_suffix
	::=	'<' template_arg (',' template_arg)* '>'

operator_declarator_qualifier
	::=	operator_name
	|	type_name_no_suffix
	|	'(' ')'
	|	TokenKind_Ellipsis
	|	TokenKind_Cdecl TokenKind_Ellipsis
	|	TokenKind_BindingOf

postfix_operator_declarator_qualifier
	::=	TokenKind_Inc
	|	TokenKind_Dec

operator_name
	::=	'~'
	|	'!'
	|	TokenKind_Inc
	|	TokenKind_Dec
	|	TokenKind_Ptr
	|	'+'
	|	'-'
	|	'*'
	|	'/'
	|	'%'
	|	TokenKind_Shl
	|	TokenKind_Shr
	|	'&'
	|	'^'
	|	'|'
	|	TokenKind_Eq
	|	TokenKind_Ne
	|	'<'
	|	TokenKind_Le
	|	'>'
	|	TokenKind_Ge
	|	'='
	|	TokenKind_RefAssign
	|	TokenKind_AddAssign
	|	TokenKind_SubAssign
	|	TokenKind_MulAssign
	|	TokenKind_DivAssign
	|	TokenKind_ModAssign
	|	TokenKind_ShlAssign
	|	TokenKind_ShrAssign
	|	TokenKind_AndAssign
	|	TokenKind_XorAssign
	|	TokenKind_OrAssign
	|	TokenKind_AtAssign
	|	TokenKind_LogAnd
	|	TokenKind_LogOr
	|	'[' ']'
	|	'@'

array_suffix
	::=	'[' ']'
	|	'[' expression_pass1 ']'

function_suffix_rslv
	::=	'(' ')'
	|	'(' TokenKind_Ellipsis
	|	'(' type_name_rslv

bitfield_suffix
	::=	':' TokenKind_Integer

template_arg
	::=	TokenKind_Identifier ('=' type_name_declarator)?

function_formal_argument_list
	::=	function_formal_argument (',' function_formal_argument)*

function_formal_argument
	::=	declaration_specifier_list declarator_prefix* declarator_name? declarator_suffix* ('=' expression_pass1)?
	|	TokenKind_Ellipsis

arg_list_pass1
	::=	arg_list_pass1_impl

enum_specifier
	::=	(TokenKind_Enum | TokenKind_BitFlagEnum) TokenKind_Identifier? (':' type_name)? ('{' enum_const_list '}' | TokenKind_Body)

struct_specifier
	::=	TokenKind_Struct (TokenKind_Identifier? (':' type_name_list)? derivable_type_member_block | TokenKind_Identifier template_decl_suffix (':' template_type_name_list)? declaration_body_pass1)

union_specifier
	::=	TokenKind_Union TokenKind_Identifier? (derivable_type_member_block | TokenKind_Identifier template_decl_suffix declaration_body_pass1)

class_specifier
	::=	TokenKind_Class TokenKind_Identifier ((':' type_name_list)? derivable_type_member_block | template_decl_suffix (':' template_type_name_list)? declaration_body_pass1)

opaque_class_specifier
	::=	TokenKind_OpaqueClass TokenKind_Identifier (':' type_name_list)? derivable_type_member_block

library_specifier
	::=	TokenKind_DynamicLib TokenKind_Identifier ('{' member_block_declaration_list '}' | TokenKind_Body)

enum_const_list
	::=	enum_const (',' enum_const)*

enum_const
	::=	attribute_block? TokenKind_Identifier ('=' expression_pass1)?
	|	epsilon

enum_const_sync
	::=	','
	|	'}'

derivable_type_member_block
	::=	'{' member_block_declaration_list '}'
	|	TokenKind_Body

declaration_body_pass1
	::=	TokenKind_Body
	|	compound_stmt_pass1

compound_stmt
	::=	'{' local_declaration_list '}'

constructor_compound_stmt
	::=	'{' btm_construct_stmt* local_declaration_list '}'

btm_construct_stmt_rslv
	::=	TokenKind_BaseType '.' TokenKind_Construct
	|	(TokenKind_Identifier '.')+
	|	';'

btm_construct_stmt
	::=	TokenKind_BaseType '.' TokenKind_Construct '(' expression_or_empty_list ')'
	|	btm_construct_name '(' expression_or_empty_list ')'
	|	';'

expression_or_empty_list
	::=	expression (',' expression_or_empty)*
	|	',' expression_or_empty (',' expression_or_empty)*
	|	epsilon

btm_construct_name
	::=	(TokenKind_Identifier '.')+

if_stmt
	::=	TokenKind_If '(' reactive_expression ')' local_branch_declaration (TokenKind_Else local_branch_declaration)?

switch_stmt
	::=	TokenKind_Switch '(' reactive_expression ')' '{' switch_block_stmt_list '}'

regex_switch_stmt_rslv
	::=	TokenKind_Switch '(' expression ','?

regex_switch_stmt
	::=	TokenKind_Switch '(' reactive_expression (',' reactive_expression)? ')' '{' regex_switch_block_stmt_list '}'

while_stmt
	::=	TokenKind_While '(' expression ')' local_branch_declaration

do_stmt
	::=	TokenKind_Do local_branch_declaration TokenKind_While '(' expression ')'

for_stmt
	::=	TokenKind_For '(' (local_item_declaration | expression_or_empty_list ';') for_stmt_condition ';' expression_list? ')' local_branch_declaration

break_stmt
	::=	TokenKind_Break ';'

continue_stmt
	::=	TokenKind_Continue ';'

return_stmt
	::=	TokenKind_Return expression? ';'

once_stmt
	::=	storage_specifier? TokenKind_Once statement

try_stmt
	::=	TokenKind_Try '{' local_declaration_list '}'

throw_stmt
	::=	TokenKind_Throw expression? ';'

unsafe_stmt
	::=	TokenKind_Unsafe '{' local_declaration_list '}'

assert_stmt
	::=	TokenKind_Assert '(' expression_pass1 (',' TokenKind_Literal)? ')' ';'

dynamic_layout_stmt
	::=	TokenKind_DynamicLayout '(' expression ')' '{' local_declaration_list '}'

dynamic_group_stmt
	::=	TokenKind_DynamicField TokenKind_Identifier? '{' local_declaration_list '}'

onevent_stmt
	::=	TokenKind_OnEvent event_name function_suffix declaration_body_pass1

reactive_expression
	::=	conditional_expr

switch_stmt_sync
	::=	local_declaration_sync
	|	TokenKind_Case
	|	TokenKind_Default

switch_block_stmt_list
	::=	switch_block_stmt*

switch_block_stmt
	::=	TokenKind_Case constant_integer_expr ':'
	|	TokenKind_Default ':'
	|	local_declaration

expression
	::=	conditional_expr

regex_switch_block_stmt_list
	::=	regex_switch_block_stmt*

regex_switch_block_stmt
	::=	TokenKind_Case regex_switch_case_literal ':'
	|	TokenKind_Default ':'
	|	local_declaration

regex_switch_case_literal
	::=	literal

literal
	::=	literal_atom+

for_stmt_condition
	::=	expression
	|	epsilon

expression_list
	::=	expression (',' expression)*

event_name
	::=	'(' expression_list ')'
	|	TokenKind_BindingOf '(' expression ')'
	|	any+

compound_stmt_pass1
	::=	'{' statement_pass1* '}'

statement_pass1
	::=	compound_stmt_pass1
	|	TokenKind_Catch
	|	TokenKind_Finally
	|	TokenKind_NestedScope
	|	TokenKind_Case
	|	TokenKind_Default
	|	any

expression_pass1_item
	::=	'{' expression_pass1_item* '}'
	|	'[' expression_pass1_item* ']'
	|	'(' expression_pass1_item* ')'
	|	template_instantiate_operator_pass1
	|	any

template_instantiate_operator_pass1_rslv_item
	::=	qualified_name_rslv
	|	type_specifier_sync
	|	type_modifier_sync
	|	template_instantiate_operator_pass1_rslv
	|	'*'
	|	','

template_instantiate_operator_pass1_item
	::=	template_instantiate_operator_pass1
	|	any

arg_list_pass1_impl
	::=	'(' arg_list_pass1_item* ')'

arg_list_pass1_item
	::=	arg_list_pass1_impl
	|	any

curly_initializer_pass1_impl
	::=	'{' curly_initializer_pass1_item* '}'

curly_initializer_pass1_item
	::=	curly_initializer_pass1_impl
	|	any

expression_save
	::=	expression

expression_or_empty_list_save
	::=	expression_or_empty_list

conditional_expr
	::=	logical_or_expr ('?' conditional_expr ':' conditional_expr)?

expression_0
	::=	conditional_expr

expression_or_empty
	::=	conditional_expr
	|	epsilon

constant_expr
	::=	conditional_expr

logical_or_expr
	::=	logical_and_expr (TokenKind_LogOr logical_and_expr)*

logical_and_expr
	::=	inclusive_or_expr (TokenKind_LogAnd inclusive_or_expr)*

inclusive_or_expr
	::=	exclusive_or_expr ('|' exclusive_or_expr)*

exclusive_or_expr
	::=	and_expr ('^' and_expr)*

and_expr
	::=	equality_expr ('&' equality_expr)*

equality_expr
	::=	relational_expr (equality_operator relational_expr)*

relational_expr
	::=	shift_expr (relational_operator shift_expr)*

equality_operator
	::=	TokenKind_Eq
	|	TokenKind_Ne
	|	TokenKind_Match
	|	TokenKind_NotMatch

shift_expr
	::=	additive_expr (shift_operator additive_expr)*

relational_operator
	::=	'<'
	|	'>'
	|	TokenKind_Le
	|	TokenKind_Ge

additive_expr
	::=	multiplicative_expr (additive_operator multiplicative_expr)*

shift_operator
	::=	TokenKind_Shl
	|	TokenKind_Shr

multiplicative_expr
	::=	at_expr (multiplicative_operator at_expr)*

additive_operator
	::=	'+'
	|	'-'

at_expr
	::=	assignment_expr ('@' assignment_expr)*

multiplicative_operator
	::=	'*'
	|	'/'
	|	'%'

assignment_expr
	::=	unary_expr assignment_operator_expr?

unary_expr
	::=	postfix_expr
	|	unary_operator_expr

assignment_operator_expr
	::=	assignment_operator conditional_expr
	|	'=' curly_initializer

assignment_operator
	::=	'='
	|	TokenKind_RefAssign
	|	TokenKind_AddAssign
	|	TokenKind_SubAssign
	|	TokenKind_MulAssign
	|	TokenKind_DivAssign
	|	TokenKind_ModAssign
	|	TokenKind_ShlAssign
	|	TokenKind_ShrAssign
	|	TokenKind_AndAssign
	|	TokenKind_XorAssign
	|	TokenKind_OrAssign

curly_initializer
	::=	'{' curly_initializer_item (',' curly_initializer_item)* '}'

postfix_expr
	::=	primary_expr postfix_operator*

unary_operator_expr
	::=	'+' unary_expr
	|	'-' unary_expr
	|	'~' unary_expr
	|	'&' unary_expr
	|	'*' unary_expr
	|	'!' unary_expr
	|	TokenKind_Inc unary_expr
	|	TokenKind_Dec unary_expr
	|	TokenKind_Await unary_expr
	|	'(' type_name ')' unary_expr
	|	TokenKind_DynamicCast '(' type_name ')' unary_expr
	|	TokenKind_New new_operator_type new_operator_curly_initializer?
	|	try_operator

new_operator_type
	::=	type_name_impl
	|	qualified_type_name TokenKind_Construct? '(' expression_or_empty_list ')'

new_operator_curly_initializer
	::=	curly_initializer

try_operator
	::=	TokenKind_Try unary_expr

primary_expr
	::=	'(' conditional_expr ')'
	|	literal
	|	TokenKind_BaseType
	|	TokenKind_Identifier
	|	TokenKind_This
	|	TokenKind_Integer
	|	TokenKind_Fp
	|	TokenKind_True
	|	TokenKind_False
	|	TokenKind_Null
	|	TokenKind_ReGroup
	|	TokenKind_SizeOf '(' type_name_or_expr ')'
	|	TokenKind_CountOf '(' type_name_or_expr ')'
	|	TokenKind_TypeOf '(' type_name_or_expr ')'
	|	TokenKind_DeclOf '(' type_name_or_expr ')'
	|	TokenKind_OffsetOf '(' expression_0 ')'
	|	TokenKind_BindingOf '(' conditional_expr ')'
	|	TokenKind_DynamicSizeOf '(' expression ')'
	|	TokenKind_DynamicCountOf '(' expression ')'
	|	TokenKind_DynamicTypeOf '(' expression ')'
	|	TokenKind_DynamicOffsetOf '(' expression ')'

postfix_operator
	::=	'(' expression_or_empty_list ')'
	|	'~' '(' expression_or_empty_list ')'
	|	'[' expression_or_empty ']'
	|	TokenKind_Inc
	|	TokenKind_Dec
	|	'.' member_operator
	|	TokenKind_Ptr member_operator
	|	'<' template_inst_type_name_list '>'

member_operator
	::=	TokenKind_Identifier
	|	TokenKind_BaseType
	|	TokenKind_Get
	|	TokenKind_Set

type_name_or_expr
	::=	type_name
	|	expression_0

literal_atom
	::=	TokenKind_Literal
	|	TokenKind_BinLiteral
	|	TokenKind_FmtMlEnd
	|	TokenKind_FmtLiteral expression TokenKind_FmtSpecifier?
	|	TokenKind_FmtLiteral TokenKind_FmtIndex
	|	TokenKind_FmtLiteral TokenKind_FmtSpecifier

curly_initializer_item
	::=	curly_initializer_named_item
	|	curly_initializer_indexed_item
	|	epsilon

curly_initializer_named_item
	::=	TokenKind_Identifier '=' (curly_initializer | expression)

curly_initializer_indexed_item
	::=	expression
	|	curly_initializer