ocamlyacc中的空规则

时间:2012-12-28 21:26:24

标签: ocaml yacc

我有以下词法规则:

let ws = [' ' '\t' '\n']+
... 
| ws                  {Printf.printf "%s" (Lexing.lexeme lexbuf); WS(Lexing.lexeme lexbuf)}

以下解析器规则:

%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给出了没有空格的情况的语法错误(对应于空规则)。

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

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

wsornon:
  |    { something for nothing }
  | WS { something for whitespace }

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

如果你想忽略空格,为什么不在lexer步骤中完全放弃它呢?它在你的语法中的其他地方有用吗?我宁愿在一些令牌之后稍微修改词法分析器以获得一些空白令牌,我知道它们比重要的还要污染我的整个语法。当然,menhir允许定义可以帮助解决的参数化规则(例如未经测试的示例):

ws(rule):
| LIST(WS) result = rule LIST(WS) { result }