我有以下词法规则:
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
给出了没有空格的情况的语法错误(对应于空规则)。
我错过了什么吗?
答案 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 }