首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ocamlyacc中的空规则

ocamlyacc中的空规则
EN

Stack Overflow用户
提问于 2012-12-29 05:26:24
回答 1查看 869关注 0票数 1

我有以下词法分析器规则:

代码语言:javascript
复制
let ws = [' ' '\t' '\n']+
... 
| ws                  {Printf.printf "%s" (Lexing.lexeme lexbuf); WS(Lexing.lexeme lexbuf)}

和以下解析器规则:

代码语言:javascript
复制
%token <string>  WORD WS 
cs               :  LSQRB wsornon choices wsornon RSQRB {$2}
                 ;

wsornon          : /* nothing */
                 | WS {$1}
                 ;

choices          :  choice {$1}
                 |  choices choice {$2}
                 ;

choice           :  CHOICE LCURLYB mainbody RCURLYB {$3}
                 ;

我基本上想让wsornon与空格匹配,否则就不匹配。但是对于没有空格(对应于空规则)的情况,cs给出了语法错误。

我是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-29 05:34:28

即使你解析了空流,你也应该有一个产生式规则:

代码语言:javascript
复制
wsornon:
  |    { something for nothing }
  | WS { something for whitespace }

请注意,menhir有一个OPTION参数化规则,它适用于这类事情,因此您不必为此编写另一个规则。实际上,如果规则OPTION(foo)返回类型为bar option的内容,那么foo将返回类型为bar的结果,而您无论如何都会忽略它们,所以这是一个有点不同的情况。

如果您想忽略空格,为什么不在lexer步骤中完全删除它呢?在你的语法中,它在其他地方有用吗?我宁愿稍微修改一下词法分析器,在一些我知道它们很重要的标记后面有一些空格标记,而不是让它们污染我的整个语法。当然,menhir允许定义参数化的规则,这可能会对此有所帮助(下面的示例未经测试):

代码语言:javascript
复制
ws(rule):
| LIST(WS) result = rule LIST(WS) { result }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14076006

复制
相关文章

相似问题

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