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>
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'
表示。