A Theta programozási nyelv

A nyelvtan

Chapter 1
Ez a fejezet megadja a Theta nyelvtanát.

program units, routine specifications (rutin specifikációk), and equates (egyenlőségek)

<program_unit> -> <routine_interface> | <equate> | <type_interface> | <module>
 
<routine_interface> -> <proc_interface> | <iter_interface>
 
<equate> -> <idn> "=" <expr> | <idn> "=" <type_designator>
 
<proc_interface> -> <idn> [<parms>] <formal_args> [<returns>] [<signals>] [<where>]
 
<iter_interface> -> <idn> [<parms>] <formal_args> <yields> [<signals>] [<where>]
 
<parms> -> "[" <idn_list> "]"
 
<idn_list> -> <idn> ["," <idn>]*
 
<formal_args> -> "(" [<decl> ["," <decl>]*] ")"
 
<decl> -> <idn_list> ":" <type_designator>
 
<returns> -> returns "(" <type_list> ")"
 
<type_list> -> <type_designator> ["," <type_designator>]*
 
<yields> -> yields "(" <type_list> ")"
 
<signals> -> signals "(" <exception> ["," <exception>]* ")"
 
<exception> -> <name> ["(" <type_list> ")"]
 
<name> -> <idn>
 
<where> -> where <restriction> ["," <restriction>]*
 
<restriction> -> <idn> has <nonparam_interface> ["," <nonparam_interface>]*
 
<nonparam_interface> -> <idn> <nonparam_proc_sig> | <idn> <nonparam_iter_sig>
 
<nonparam_proc_sig> -> "(" [<type_list>] ")" [<returns>] [<signals>]
 
<nonparam_iter_sig> -> "(" [<type_list>] ")" <yields> [<signals>]

type specifications (típus specifikációk)

<type_interface> -> <idn> "=" type [<parms>] [<supertypes>] [<where>]
[<interface_or_equate>]*
end <idn>
 
<supertypes> -> "<" <superinfo> ["," <superinfo>]*
 
<superinfo> -> <type_designator> ["{" <renames> ["," <renames>]* "}" ]
 
<renames> -> <idn> for <idn>
 
<interface_or_equate> -> <routine_interface> | <equate>

type designators (típus jelölések)

<type_designator> -> <simple_type_desig> | <routine_type_desig> | <parm_type_desig>
 | <tagged_type_desig>
 
<simple_type_desig> -> <idn> | 'null' | 'bool' | 'char' | 'int' | 'real' | 'string' | 'any'
 
<routine_type_desig> -> proc <nonparam_proc_sig> | iter <nonparam_iter_sig>
 
<parm_type_desig> -> <parm_type> <actual_parms>
 
<parm_type> -> <idn> | 'array' | 'sequence' | 'vector' | 'maybe'
 
<actual_parms> -> "[" <type_list> "]"
 
<tagged_type_desig> -> <tagged_type> "[" <field> ["," <field>]* "]"
 
<tagged_type> -> 'record' | 'struct' | 'oneof'
 
<field> -> <idn_list> ":" <type_designator>

modules (modulok)

<module> -> module [<implements>] [<impl_elt>]* end
 
<implements> -> implements <exported_item> ["," <exported_item>]*
 
<exported_item> -> <idn> [ "{" <idn_list> "}" ] | <idn> <actual_parms> "{" <idn_list> "}"
 
<impl_elt> -> <routine_def> | <class_def> | <maker_def> | <equate>
 
<routine_def> -> <routine_interface> <body> end <idn>
 
<maker_def> -> <maker_interface> <body> end <idn>
 
<maker_interface> -> <idn> [<parms>] <formal_args> <makes> [<signals>] [<where>]
 
<makes> -> makes "(" <type_designator> ")"
 
<body> -> [<equate>]* [<statement>]*
 
<class_def> -> <idn> "=" class [<parms>] [<for_type>] [<inherits>]
[<where>] [<provides>] [<hides>]
[<equate_or_ivar_decl>]*
[<equate_or_routine_def>]*
end <idn>
 
<for_type> -> for <type_designator>
 
<inherits> -> inherits <type_designator> ["{" <renames> ["," <renames>]* "}"]
 
<provides> -> provides <idn_list>
 
<hides> -> hides <idn_list>
 
<equate_or_ivar_decl> -> <equate> | <ivar_decl>
 
<ivar_decl> -> <decl> | <decl_with_impls>
 
<decl_with_impls> -> <idn> ":" <type_designator> implements <idn> ["," <idn>]
 
<equate_or_routine_def> -> <equate> | <routine_def>

statements (utasítások)

<statement> -> <decl>
| <lhs> ":=" <expr> ["," <expr>]*
| <lhs> ":=" <invoc>
| <simple_invoc>
| <primary> "[" <expr> "]" ":=" <expr>
| return ["(" <expr> ["," <expr>]* ")"]
| yield "(" <expr> ["," <expr>]* ")"
| signal <name> ["(" <expr> ["," <expr>]* ")"]
| exit <name> ["(" <expr> ["," <expr>]* ")"]
| if <expr> then <body> [elseif <expr> then <body>]* [else <body>] end
| while <expr> do <body> end
| for <for_idns> in <invoc> do <body> end
| break
| continue
| begin <body> end
| tagcase <expr> <tag_arm> [<tag_arm>]* [others ":" <body>] end
| typecase <expr> <type_arm> [<type_arm>]* [others ":" <body>] end
| <statement> except [<handler>]* [others ["(" <idn> ":" 'string' ")"] ":" <body>] end
| <statement> resignal <name> ["," <name>]*
| make "{" [<ivar_inits>] "}" [then <body> end]
 
<lhs> -> <var> ["," <var>]* | <decl> ["," <decl>]*
 
<var> -> <idn> | <primary> "." <idn>
 
<invoc> -> <expr> "(" [<args>] ")"
 
<args> -> <expr> ["," <expr>]* ["," <varying_args>] | <varying_args>
 
<varying_args> -> .. | .. <expr> ["," <expr>]*
 
<simple_invoc> -> <primary> "(" [<args>] ")"
 
<for_idns> -> <idn_list> | <decl> ["," <decl>]*
 
<tag_arm> -> when <name> ["," <name>]* ["(" <idn> ":" <type_designator> ")"] ":" <body>
 
<type_arm> -> when <type_designator> ["(" <idn> ")"] ":" <body>
 
<handler> -> when <name> ["," <name>]* ["(" <decl> ["," <decl>]* ")"] ":" <body>
 
<ivar_inits> -> <field_inits> ";" <maker_invoc> | <field_inits> | <maker_invoc>
 
<field_inits> -> <field_init> ["," <field_init>]*
 
<field_init> -> <idn> ":=" <expr>
 
<maker_invoc> -> <idn> [<actual_parms>] "(" [<args>] ")"

expressions (kifejezések)

<expr> -> <simple_expr>
| <expr> "." <idn>
| <expr> "." <method_idn>
| <invoc>
| <expr> "[" <expr> "]"
| "~" <expr>
| "-" <expr>
| <expr> <binary_op> <expr>
| "(" <expr> ")"
 
<primary> -> <simple_expr>
| <primary> "." <idn>
| <primary> "." <method_idn>
| <simple_invoc>
| <primary> "[" <expr> "]"
 
<simple_expr> -> <literal>
| <idn> [<actual_parms>]
| self
| <method_idn>
| <tagged_type_desig> "{" <field_inits> "}"
| <type_designator> "{" [<ivar_inits>] "}"
| bind "(" <expr> <bind_args> ")"
 
<method_idn> -> ["^"] <idn> [<actual_parms>]
 
<bind_args> -> ["," <bind_arg>]* ["," <varying_args>]
 
<bind_arg> -> <expr> | "*"
 
<literal> -> 'nil'
| 'true'
| 'false'
| <int_literal>
| <char_literal>
| <real_literal>
| <string_literal>
 
<binary_op> -> "**" | "//" | "/" | "*" | "||" | "+" | "-" | "<" | "<="
 | "=" | ">=" | ">" | "==" | "~=" | "&" | "|"