当前位置: 首页 > 文档资料 > Erlang 并发编程 >

附录 A Erlang 语法参考

优质
小牛编辑
120浏览
2023-12-01

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

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

类型优先级运算符
Nonassoc0'catch'.
Right200'='.
Right200'!'.
Left300add op.
Left400mult op.
Nonassoc500prefix op.

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

非终结符编号
add_op*1 11 27
attribute*44 47
basic_type*5 6 11 27
bif_test*34 35
case_expr11 *17
clause_body18 21 23 38 *42
clause_guard18 38 *41
clause_head38 *39
comp_op*2 35
cr_clause*18 19
cr_clauses17 *19 19 23
expr*11 11 12 13 17 23 24 25 26
expr_tail12 *13 13
exprs11 14 16 *26 26 42
farity45 *46
farity_list44 *45 45
form*47
formal_parameter_list39 *40
function*43 43 47
function_call11 *15
function_clause*38 43
guard21 *37 41
guard_call27 *32
guard_expr*27 27 28 29 31 35
guard_expr_list27 *28
guard_expr_tail28 *29 29
guard_expr_tuple27 *30
guard_exprs30 *31 31 33
guard_parameter_list32 *33 34
guard_test*35 36
guard_tests*36 36 37
if_clause*21 22
if_clauses20 *22 22
if_expr11 *20
list11 *12
match_expr11 *24
mult_op*3 11 27
parameter_list15 *16
pattern*6 7 8 10 18 44
pattern_list6 *7
pattern_tail7 *8 8
pattern_tuple6 *9
patterns9 *10 10 40
prefix_op*4 11 27
receive_expr11 *23
send_expr11 *25
tuple11 *14