首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Camlp4解析一串通用和存在量词

使用Camlp4解析一串通用和存在量词
EN

Stack Overflow用户
提问于 2015-07-06 06:29:00
回答 1查看 84关注 0票数 2

我正在使用Camlp4解析一串量化关键字和变量用逗号分隔的量词。一个例子如下:

代码语言:javascript
运行
复制
exists x,y,z, forall a,b, exists h,k

在这里,existsforall是关键字,x,y,z,a,b,h,k是标识符。相应的令牌是EXISTSFORALLIDENTIFIER of string

我的数据结构:

代码语言:javascript
运行
复制
type quantifier =
  | Exists of string
  | Forall of string

要解析上面的量词字符串,我的规则是:

代码语言:javascript
运行
复制
id: [[
  `IDENTIFIER s-> s
]];

one_kind_quantifiers: [[
  `EXISTS; il=LIST1 id SEP `COMMA -> List.map (fun v -> Exists v) il
 |`FORALL; il=LIST1 id SEP `COMMA -> List.map (fun v -> Forall v) il
]];

quantifiers: [[
  t=LIST0 one_kind_quantifiers SEP `COMMA -> List.flatten t
]];

但是,我的解析器总是抛出一个错误:

代码语言:javascript
运行
复制
Stream.Error("[id] expected after COMMA (in [one_kind_quantifiers])").

你知道怎么解决这个问题吗?如何使LIST1`COMMA是关键字之后检测到元素时停止抛出错误?

非常感谢!

(有关更多信息,如果我使用空白分隔受相同量化关键字(如exists x y z, forall a b, exists h k )影响的变量。并删除SEP `COMMA规则中的one_kind_quantifiers,那么解析器就可以完美地解析这个新字符串)。

===========================

更新解决方案:

在Igor (@ygrek)的建议下,我能够编写预期的解析器,方法不是使用LIST1,而是手动编写规则来解析字符串列表。

代码语言:javascript
运行
复制
id_list: [[
  `IDENTIFIER s -> [s]
 |t=`id_list; `COMMA; `IDENTIFIER s -> t@[s]
]];

one_kind_quantifiers: [[
  `EXISTS; il=id_list -> List.map (fun v -> Exists v) il
 |`FORALL; il=id_list -> List.map (fun v -> Forall v) il
]];

quantifiers: [[
  t=LIST0 one_kind_quantifiers SEP `COMMA -> List.flatten t
]];

请注意,解析字符串列表的规则是:

代码语言:javascript
运行
复制
id_list: [[
   `IDENTIFIER s -> [s]
 | t=`id_list; `COMMA; `IDENTIFIER s -> t@[s]
]];

但不是:

代码语言:javascript
运行
复制
id_list: [[
   `IDENTIFIER s -> [s]
 | `IDENTIFIER s; `COMMA; t=`id_list -> [s]@t
]];

编写id_list规则的第二种方法会引发与使用LIST1时相同的错误。(所以我猜也许这就是实现LIST1的方式.)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-09 23:36:21

camlp4是递归下降解析器,IIRC只对每个规则的第一个令牌进行回溯,一旦第一个令牌匹配,它将一直持续到规则的末尾。在这种情况下,对于LIST1,它可以在逗号上匹配,所以它会下降,但是第二个令牌并不像预期的那样,而且已经太晚了,无法回溯。我想展开LIST1并将其嵌入到语法中会解决这个问题,但可能会相当丑陋。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31238993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档