我有以下词法分析器规则:
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给出了语法错误。
我是不是遗漏了什么?
发布于 2012-12-29 05:34:28
即使你解析了空流,你也应该有一个产生式规则:
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 }https://stackoverflow.com/questions/14076006
复制相似问题