附录A Erlang 语法参考

附录A Erlang 语法参考

这部分语法参考是 LALR 语法的改编版本。

此语法和严格的 LALR 语法对 match_expr 有不同理解。 match_expr 中等号左边可以是一个模式或者表达式, Erlang 编译器会在语义分析时确定其含义。

类型 优先级 运算符
Nonassoc 0 'catch'.
Right 200 '='.
Right 200 '!'.
Left 300 addop.
Left 400 multop.
Nonassoc 500 prefixop.

编号 非终结符 表达式
1 addop :="+"|"-"|"bor"|"bxor"|"bsl"|"bsr"
2 comp_op :="=="|"/="|"=<"|"<"|">="|">"|"=:="|"=/="
3 mult_op :="*"|"/"|"div"|"rem"|"band"
4 prefix_op :="+"|"-"|"bnot"
5 basic_type :="atom"|"number"|"string"|"var"|"true"
6 pattern :=basic_type|pattern_list|pattern_tuple
7 pattern_list :="[""]"|"["patternpatterntail"]"
8 pattern_tail :="|"pattern|","patternpattern_tail|ε
9 pattern_tuple :="{""}"|"{"patterns"}"
10 patterns :=pattern|pattern","patterns
11 expr :=basic_type|list|tuple|function_call|expraddopexpr|exprmult_opexpr|prefix_opexpr|"("expr")"|"begin"exprs"end"|"catch"expr|case_expr|if_expr|receive_expr|match_expr|sendexpr
12 list :="[""]"|"["exprexpr_tail"]"
13 expr_tail :="|"expr|","exprexpr_tail|ε
14 tuple :="{""}"|"{"exprs"}"
15 function_call :="atom""("parameter_list")"|"atom"":""atom""("parameter_list")"
16 parameter_list :=exprs|ε
17 case_expr :="case"expr"of"cr_clauses"end"
18 cr_clause :=patternclause_guardclause_body
19 cr_clauses :=cr_clause|cr_clause";"cr_clauses
20 if_expr :="if"if_clauses"end"
21 if_clause :=guardclause_body
22 if_clauses :=if_clause|if_clause";"if_clauses
23 receive_expr :="receive""after"exprclause_body"end"|"receive"cr_clauses"end"|"receive"cr_clauses"after"exprclause_body"end"
24 match_expr :=expr"="expr
25 sendexpr :=expr"!"expr
26 exprs :=expr|expr","exprs
27 guard_expr :=basic_type|guard_expr_list|guard_expr_tuple|guard_call|"("guard_expr")"|guard_expraddopguard_expr|guard_exprmult_opguard_expr|prefix_opguard_expr
28 guard_expr_list :="[""]"|"["guard_exprguard_expr_tail"]"
29 guard_expr_tail :="|"guard_expr|","guard_exprguard_expr_tail|ε
30 guard_expr_tuple :="{""}"|"{"guard_exprs"}"
31 guard_exprs :=guard_expr|guard_expr","guard_exprs
32 guard_call :="atom""("guard_parameter_list")"
33 guard_parameter_list :=guard_exprs|ε
34 bif_test :="atom""("guard_parameter_list")"
35 guard_test :=bif_test|guard_exprcomp_opguard_expr
36 guard_tests :=guard_test|guard_test","guard_tests
37 guard :="true"|guard_tests
38 function_clause :=clause_headclause_guardclause_body
39 clause_head :="atom""("formalparameter_list")"
40 formalparameter_list :=patterns|ε
41 clause_guard :="when"guard|ε
42 clause_body :="->"exprs
43 function :=function_clause|function_clause";"function
44 attribute :=pattern|"["farity_list"]"|"atom"",""["farity_list"]"
45 farity_list :=farity|farity","farity_list
46 farity :="atom""/""number"
47 form :="-""atom""("attribute")"|function

非终结符 编号
add_op 1 11 27
attribute 44 47
basic_type 5 6 11 27
bif_test 34 35
case_expr 11 17
clause_body 18 21 23 38 42
clause_guard 18 38 41
clause_head 38 39
comp_op 2 35
cr_clause 18 19
cr_clauses 17 19 19 23
expr 11 11 12 13 17 23 24 25 26
expr_tail 12 13 13
exprs 11 14 16 26 26 42
farity 45 46
farity_list 44 45 45
form 47
formal_parameter_list 39 40
function 43 43 47
function_call 11 15
function_clause 38 43
guard 21 37 41
guard_call 27 32
guard_expr 27 27 28 29 31 35
guard_expr_list 27 28
guard_expr_tail 28 29 29
guard_expr_tuple 27 30
guard_exprs 30 31 31 33
guard_parameter_list 32 33 34
guard_test 35 36
guard_tests 36 36 37
if_clause 21 22
if_clauses 20 22 22
if_expr 11 20
list 11 12
match_expr 11 24
mult_op 3 11 27
parameter_list 15 16
pattern 6 7 8 10 18 44
pattern_list 6 7
pattern_tail 7 8 8
pattern_tuple 6 9
patterns 9 10 10 40
prefix_op 4 11 27
receive_expr 11 23
send_expr 11 25
tuple 11 *14