Epsilon

Epsilon (epsilon_peps_p) 是一款多用途解析器,它返回零长度匹配。

简单形式

在最简单的形式中,epsilon_p 匹配空字符串,并始终返回零长度匹配

    epsilon_p // always returns a zero-length match

此形式通常用于在无条件的情况下触发 语义动作。例如,它对于在选项集失败时触发错误消息非常有用

    r = A | B | C | eps_p[error]; // error if A, B, or C fails to match

语义谓词

语义谓词允许你将函数附加到语法中的任何位置。在此角色中,epsilon 采用 0 元(空元)函数/函子。运行时函数/函子通常是在调用某项测试来解决语法中含糊的部分。当函数/函子结果计算为 false 时,将报告解析失败。否则,将报告一个空匹配。一般形式为:

    eps_p(f) >> rest;

空元函数f被调用来执行语义测试(例如,检查一个符号是否在 符号表)中。如果测试返回true, rest将被计算。否则,表达将使用不匹配状态提前返回,而不会接触rest.

句法谓词

与语义谓词类似,句法谓词断言在计算另一个表达前要满足一定的条件句法。这次,epsilon_p 接受(条件)解析器。一般形式为:

    eps_p(p) >> rest;

如果p在输入流中匹配,那么尝试识别rest. 解析器p被调用来执行句法检查。无论p的成功与否,eps_p(p)始终会返回零长度匹配(即,不消耗输入)。如果测试返回true, rest将被计算。否则,表达将使用不匹配状态提前返回,而不会接触rest.

示例

    eps_p('0') >> oct_p // note that '0' is actually a ch_p('0') 

此处的 Epsilon 用作句法谓词。oct_p(参见 数值)仅在我们看到前导'0'时才解析。将前导'0'包装在 epsilon 内部使解析器不会消耗输入中的任何内容。如果看到'0'epsilon_p报告零长度匹配成功。

基本参数

Epsilon 支持基本类型参数,例如char, int, wchar_t, char const*, wchar_t const*等等。示例

eps_p("hello") // 等效于 eps_p(str_p("hello"))
eps_p
('x') // 等效于 eps_p(ch_p('x'))

抑制语义动作

在句法谓词eps_p(p)中,任何直接或间接附加到条件解析器的语义动作p不会被调用。但是,附加到 epsilon 本身的语义动作将始终被调用。以下代码片段阐述了此行为

    eps_p(c[f])  // f not called
eps_p(c)[f] // f is called
eps_p[f] // f is called

实际上,条件解析器p隐式地包装在no_actions_d指令中

    no_actions_d[p]

条件解析器必须没有副作用(语义动作)。条件解析器的目的是通过向前查看输入流中的某个模式来解决歧义。歧义和语义动作并不兼容。在歧义语法中,会发生回溯。当发生这种情况时,我们无法取消触发的语义动作的影响。

否定

运算符~专为使用epsilon_p/eps_p构建的解析器定义。它通过对报告的结果求余来执行否定。~~eps_p(x)eps_p(x).