【发布时间】:2017-04-28 06:31:56
【问题描述】:
我正在为 Prolog 中的 proto 文件实施 Google Protobuf 编译器,以生成 Prolog 程序。 Prolog 是 SWI-Prolog。
我正在将 EBNF 定义翻译成 DCG,但遇到了一些问题:
-
我必须处理
李>[ ... ]和{ ... }EBNF 构造 - 意思是optional(可执行零次或一次)和repeatative(可执行任意次数); 我必须将 回调 插入到 DCG 代码中,以使用 DCG 的构造
{ ... }实现编译器功能的一部分(语法切换/导入/等),这允许 Prolog 中的目标DCG 规则中的语法。
我正在申请 optional 和 repeatative 元谓词:$$rep/1,$$opt/1:
EBNF
decimals = decimalDigit { decimalDigit }
exponent = ( "e" | "E" ) [ "+" | "-" ] decimals
DCG
decimals --> decimalDigit, '$$rep'( decimalDigit ).
exponent --> ( "e"; "E" ), '$$opt'( "+"; "-" ), decimals.
'$$rep'( Goal ) :- repeat, call(Goal); !, fail.
'$$opt'( Goal ) :- once(Goal) ; \+ Goal.
"Callback:"
import --> "import", opt(( "weak" ; "public", { record(public)} )), strLit,
{
import(public, strlit )
}, ";".
对我来说看起来很尴尬(如果不是说丑的话)......
问题:
我的解决方案有什么问题?
我是否应该在不使用元谓词的情况下手动将 EBNG 翻译成 DCG?
对于 DCG 规则的尴尬渗透,有什么替代方法?
【问题讨论】:
标签: parsing prolog dsl dcg ebnf