Languages-beta : OC-L-07-Expressions.cbs | PLAIN | PDF
OUTLINE
Language“OCaml Light”
7 Expressions
SyntaxE:expr ::= ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ A:argument ::= PM:pattern-matching ::= ∣ LD:let-definition ::= LB:let-binding ::= ∣ ∣ ALB:and-let-binding ::= CE:comma-expr ::= SE:semic-expr ::= SFE:semic-field-expr ::= PE:pattern-expr ::= value-path constant ‘(’ expr ‘)’ ‘begin’ expr ‘end’ ‘(’ expr ‘:’ typexpr ‘)’ expr comma-expr+ expr ‘::’ expr ‘[’ expr semic-expr* ‘]’ ‘[’ expr semic-expr* ‘;’ ‘]’ ‘[|’ expr semic-expr* ‘|]’ ‘[|’ expr semic-expr* ‘;’ ‘|]’ ‘{’ field ‘=’ expr semic-field-expr* ‘}’ ‘{’ field ‘=’ expr semic-field-expr* ‘;’ ‘}’ ‘{’ expr ‘with’ field ‘=’ expr semic-field-expr* ‘}’ ‘{’ expr ‘with’ field ‘=’ expr semic-field-expr* ‘;’ ‘}’ expr argument+ prefix-symbol expr ‘-’ expr ‘-.’ expr expr infix-op-1 expr expr infix-op-2 expr expr infix-op-3 expr expr infix-op-4 expr expr infix-op-5 expr expr infix-op-6 expr expr infix-op-7 expr expr infix-op-8 expr expr ‘.’ field expr ‘.(’ expr ‘)’ expr ‘.(’ expr ‘)’ ‘<-’ expr ‘if’ expr ‘then’ expr (‘else’ expr)? ‘while’ expr ‘do’ expr ‘done’ ‘for’ value-name ‘=’ expr (‘to’∣‘downto’) expr ‘do’ expr ‘done’ expr ‘;’ expr ‘match’ expr ‘with’ pattern-matching ‘function’ pattern-matching ‘fun’ pattern+ ‘->’ expr ‘try’ expr ‘with’ pattern-matching let-definition ‘in’ expr ‘assert’ expr expr pattern ‘->’ expr pattern-expr* ‘|’ pattern ‘->’ expr pattern-expr* ‘let’ (‘rec’)? let-binding and-let-binding* pattern ‘=’ expr value-name pattern+ ‘=’ expr value-name ‘:’ poly-typexpr ‘=’ expr ‘and’ let-binding ‘,’ expr ‘;’ expr ‘;’ field ‘=’ expr ‘|’ pattern ‘->’ expr
RuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRule[[ ‘(’ E ‘)’ ]]:expr=[[ E ]][[ ‘begin’ E ‘end’ ]]:expr=[[ E ]][[ ‘(’ E ‘:’ T ‘)’ ]]:expr=[[ E ]][[ E1 E2 A A* ]]:expr=[[ (‘(’ E1 E2 ‘)’) A A* ]][[ PS E ]]:expr=[[ (‘(’ PS ‘)’) E ]][[ ‘-’ E ]]:expr=[[ (‘(’ ‘~-’ ‘)’) E ]][[ ‘-.’ E ]]:expr=[[ (‘(’ ‘~-.’ ‘)’) E ]][[ E1 IO-1 E2 ]]:expr=[[ (‘(’ IO-1 ‘)’) E1 E2 ]][[ E1 IO-2 E2 ]]:expr=[[ (‘(’ IO-2 ‘)’) E1 E2 ]][[ E1 IO-3 E2 ]]:expr=[[ (‘(’ IO-3 ‘)’) E1 E2 ]][[ E1 IO-4 E2 ]]:expr=[[ (‘(’ IO-4 ‘)’) E1 E2 ]][[ E1 IO-5 E2 ]]:expr=[[ (‘(’ IO-5 ‘)’) E1 E2 ]][[ E1 ‘&’ E2 ]]:expr=[[ E1 ‘&&’ E2 ]][[ E1 ‘or’ E2 ]]:expr=[[ E1 ‘||’ E2 ]][[ E1 IO-8 E2 ]]:expr=[[ (‘(’ IO-8 ‘)’) E1 E2 ]][[ E1 ‘.(’ E2 ‘)’ ]]:expr=[[ ‘array_get’ E1 E2 ]][[ E1 ‘.(’ E2 ‘)’ ‘<-’ E3 ]]:expr=[[ ‘array_set’ E1 E2 E3 ]][[ ‘if’ E1 ‘then’ E2 ]]:expr=[[ ‘if’ E1 ‘then’ E2 ‘else’ (‘(’ ‘)’) ]][[ ‘fun’ P ‘->’ E ]]:expr=[[ ‘function’ P ‘->’ E ]][[ ‘fun’ P P+ ‘->’ E ]]:expr=[[ ‘fun’ P ‘->’ (‘fun’ P+ ‘->’ E) ]][[ ‘[’ E SE* ‘;’ ‘]’ ]]:expr=[[ ‘[’ E SE* ‘]’ ]][[ ‘[|’ E SE* ‘;’ ‘|]’ ]]:expr=[[ ‘[|’ E SE* ‘|]’ ]][[ ‘{’ F ‘=’ E SFE* ‘;’ ‘}’ ]]:expr=[[ ‘{’ F ‘=’ E SFE* ‘}’ ]][[ ‘{’ E1 ‘with’ F ‘=’ E2 SFE* ‘;’ ‘}’ ]]:expr=[[ ‘{’ E1 ‘with’ F ‘=’ E2 SFE* ‘}’ ]][[ ‘|’ P ‘->’ E PE* ]]:pattern-matching=[[ P ‘->’ E PE* ]][[ VN ‘:’ PT ‘=’ E ]]:let-binding=[[ VN ‘=’ E ]][[ VN P+ ‘=’ E ]]:let-binding=[[ VN ‘=’ (‘fun’ P+ ‘->’ E) ]]
SemanticsRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleOtherwiseRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleRuleevaluate[[ _:expr ]]:⇒implemented-valuesevaluate[[ VP ]]=bound(value-name[[ VP ]])evaluate[[ CNST ]]=value[[ CNST ]]evaluate[[ ‘(’ E ‘:’ T ‘)’ ]]=evaluate[[ E ]]evaluate[[ E1 ‘,’ E2 CE* ]]=tuple(evaluate-comma-sequence[[ E1 ‘,’ E2 CE* ]])evaluate[[ E1 ‘::’ E2 ]]=cons(evaluate[[ E1 ]],evaluate[[ E2 ]])evaluate[[ ‘[’ E SE* ‘]’ ]]=[evaluate-semic-sequence[[ E SE* ]]]evaluate[[ ‘[|’ E SE* ‘|]’ ]]=vector(left-to-right-map(allocate-initialised-variable(implemented-values,given),evaluate-semic-sequence[[ E SE* ]]))evaluate[[ ‘[|’ ‘|]’ ]]=vector( )evaluate[[ ‘{’ F ‘=’ E SFE* ‘}’ ]]=record(collateral(evaluate-field-sequence[[ F ‘=’ E SFE* ]]))evaluate[[ ‘{’ E1 ‘with’ F ‘=’ E2 SFE* ‘}’ ]]=record(map-override(evaluate-field-sequence[[ F ‘=’ E2 SFE* ]],checked record-map(evaluate[[ E1 ]])))evaluate[[ CSTR E ]]=variant(constr-name[[ CSTR ]],evaluate[[ E ]])evaluate[[ E1 E2 ]]=apply(evaluate[[ E1 ]],evaluate[[ E2 ]])evaluate[[ E ‘.’ F ]]=record-select(evaluate[[ E ]],field-name[[ F ]])evaluate[[ E1 ‘&&’ E2 ]]=if-true-else(evaluate[[ E1 ]],evaluate[[ E2 ]],false)evaluate[[ E1 ‘||’ E2 ]]=if-true-else(evaluate[[ E1 ]],true,evaluate[[ E2 ]])evaluate[[ ‘if’ E1 ‘then’ E2 ‘else’ E3 ]]=if-true-else(evaluate[[ E1 ]],evaluate[[ E2 ]],evaluate[[ E3 ]])evaluate[[ ‘while’ E1 ‘do’ E2 ‘done’ ]]=while(evaluate[[ E1 ]],effect(evaluate[[ E2 ]]))evaluate[[ ‘for’ VN ‘=’ E1 ‘to’ E2 ‘do’ E3 ‘done’ ]]=effect(left-to-right-map(case-match(pattern-bind(value-name[[ VN ]]),evaluate[[ E3 ]]),integer-sequence(evaluate[[ E1 ]],evaluate[[ E2 ]])))evaluate[[ ‘for’ VN ‘=’ E1 ‘downto’ E2 ‘do’ E3 ‘done’ ]]=effect(left-to-right-map(case-match(pattern-bind(value-name[[ VN ]]),evaluate[[ E3 ]]),reverse integer-sequence(evaluate[[ E2 ]],evaluate[[ E1 ]])))evaluate[[ E1 ‘;’ E2 ]]=sequential(effect(evaluate[[ E1 ]]),evaluate[[ E2 ]])evaluate[[ ‘match’ E ‘with’ PM ]]=give(evaluate[[ E ]],else(match[[ PM ]],throw(ocaml-light-match-failure)))evaluate[[ ‘function’ PM ]]=function closure(else(match[[ PM ]],throw(ocaml-light-match-failure)))evaluate[[ ‘try’ E ‘with’ PM ]]=handle-thrown(evaluate[[ E ]],else(match[[ PM ]],throw(given)))evaluate[[ LD ‘in’ E ]]=scope(define-values[[ LD ]],evaluate[[ E ]])evaluate[[ ‘assert’ E ]]=else(check-true(evaluate[[ E ]]),throw(ocaml-light-assert-failure))
Expression sequences and maps
SemanticsRuleRuleevaluate-comma-sequence[[ _:(expr comma-expr*) ]]:(⇒implemented-values)+evaluate-comma-sequence[[ E1 ‘,’ E2 CE* ]]=evaluate[[ E1 ]],evaluate-comma-sequence[[ E2 CE* ]]evaluate-comma-sequence[[ E ]]=evaluate[[ E ]]
SemanticsRuleRuleevaluate-semic-sequence[[ _:(expr semic-expr*) ]]:(⇒implemented-values)+evaluate-semic-sequence[[ E1 ‘;’ E2 SE* ]]=evaluate[[ E1 ]],evaluate-semic-sequence[[ E2 SE* ]]evaluate-semic-sequence[[ E ]]=evaluate[[ E ]]
SemanticsRuleRuleevaluate-field-sequence[[ _:(field ‘=’ expr semic-field-expr*) ]]:(⇒envs)+evaluate-field-sequence[[ F1 ‘=’ E1 ‘;’ F2 ‘=’ E2 SFE* ]]={field-name[[ F1 ]]↦evaluate[[ E1 ]]},evaluate-field-sequence[[ F2 ‘=’ E2 SFE* ]]evaluate-field-sequence[[ F ‘=’ E ]]={field-name[[ F ]]↦evaluate[[ E ]]}
Matching
SemanticsRuleRulematch[[ _:pattern-matching ]]:(implemented-values⇒implemented-values)+match[[ P1 ‘->’ E1 ‘|’ P2 ‘->’ E2 PE* ]]=match[[ P1 ‘->’ E1 ]],match[[ P2 ‘->’ E2 PE* ]]match[[ P ‘->’ E ]]=case-match(evaluate-pattern[[ P ]],evaluate[[ E ]])
Value definitions
SemanticsRuleRuledefine-values[[ _:let-definition ]]:⇒environmentsdefine-values[[ ‘let’ LB ALB* ]]=define-values-nonrec[[ LB ALB* ]]define-values[[ ‘let rec’ LB ALB* ]]=recursive(set(bound-ids-sequence[[ LB ALB* ]]),define-values-nonrec[[ LB ALB* ]])
SemanticsRuleRuledefine-values-nonrec[[ _:(let-binding and-let-binding*) ]]:⇒environmentsdefine-values-nonrec[[ LB1 ‘and’ LB2 ALB* ]]=collateral(define-values-nonrec[[ LB1 ]],define-values-nonrec[[ LB2 ALB* ]])define-values-nonrec[[ P ‘=’ E ]]=else(match(evaluate[[ E ]],evaluate-pattern[[ P ]]),throw(ocaml-light-match-failure))
SemanticsRuleRulebound-ids-sequence[[ _:(let-binding and-let-binding*) ]]:ids+bound-ids-sequence[[ LB ]]=bound-id[[ LB ]]bound-ids-sequence[[ LB1 ‘and’ LB2 ALB* ]]=bound-id[[ LB1 ]],bound-ids-sequence[[ LB2 ALB* ]]
SemanticsRuleOtherwisebound-id[[ _:let-binding ]]:idsbound-id[[ VN ‘=’ E ]]=value-name[[ VN ]]bound-id[[ LB ]]=fail
←
↑
→