Skip to content

Latest commit

 

History

History
90 lines (52 loc) · 2.03 KB

yecc_spec.adoc

File metadata and controls

90 lines (52 loc) · 2.03 KB

Yecc 参考

Yecc 是 Erlang 的一个模块,用于生成 LALR-1 语法分析器。

语法分析器导出函数

parser.erl
-type yecc_ret() :: {'error', _} | {'ok', _}.
-spec parse(Tokens :: list()) -> yecc_ret().

语法文件格式

parser.yrl.template
% <Header>

% nonterminal categories

Nonterminals sentence nounphrase verbphrase.

% Terminal categories

Terminals article adjective noun verb.

% rootsymbol
Rootsymbol sentence.

% <Endsymbol>

% operator precedence & associative

% grammar rules

Erlang code.

% <Expect>

结构要求

Nonterminals/Terminals/Rootsymbol 必须要有。

<Grammer Rules> 至少要有一条。

格式要求

Operator Precedence 格式

associative precedence operator

Grammer Rule 格式

Left_hand_side -> Right_hand_side : Associated_code.

语法规则的左手边是一个非终结符,右手边是一个用空格分隔的序列,序列元素是可以是终结符,也可以是非终结符。

语法规则关联的代码是一个 Erlang 表达式序列。

如果 Erlang 表达式序列为空,则语法规则的分隔符 : 也可以省略。

其他符号必须使用单引号引起来,且不能与 '$empty', '$end', '$undefined' 等特殊符号同名。

当语法规则匹配成功时,语法分析器会求值 Erlang 表达式序列,最后一个表达式的值就是语法符号的语义值。

关联的 Erlang 代码可以包含伪变量 '$1', '$2', '$3'…​,用来引用语法规则右手边符号序列元素的语义值。

如果伪变量绑定的符号是终结符,那么伪变量的值就是一个 Token。

如果没有关联 Erlang 代码, 语法符号关联的就是 '$undefined'

语法规则的右手边可以为空, 用特殊符号 '$empty' 表示。

重点

语法分析器导出函数 Module:parse(Tokens)

理解伪变量 '$1', '$2', '$3', …​。

理解特殊变量 '$empty', '$undefined', '$end'

理解语法规则的含义。