# 附录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 |