ocamlyacc中的空规则
我有以下lexer规则:ocamlyacc中的空规则,ocaml,yacc,Ocaml,Yacc,我有以下lexer规则: 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}
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给出了与空规则对应的不带空格的情况下的语法错误
我遗漏了什么吗?即使解析空流,也应该有一个生成规则:
wsornon:
| { something for nothing }
| WS { something for whitespace }
请注意,它有一个选项参数化规则,对于这类事情来说很好,所以您不必为此编写另一个规则。事实上,如果规则foo返回bar类型的内容,那么OPTIONfoo将返回一个类型为bar的产品选项,而您无论如何都将忽略它们,所以这是一种不同的情况
如果您想忽略空白,为什么不在lexer步骤中完全删除它呢?它在你语法的其他地方有用吗?我宁愿对lexer进行一些修改,在一些标记后面加上一些空格标记,我知道它们很重要,也不愿让它们污染我的整个语法。当然,menhir允许定义参数化规则,这有助于以下未经测试的示例:
ws(rule):
| LIST(WS) result = rule LIST(WS) { result }
即使解析空流,也应该有一个生成规则:
wsornon:
| { something for nothing }
| WS { something for whitespace }
请注意,它有一个选项参数化规则,对于这类事情来说很好,所以您不必为此编写另一个规则。事实上,如果规则foo返回bar类型的内容,那么OPTIONfoo将返回一个类型为bar的产品选项,而您无论如何都将忽略它们,所以这是一种不同的情况
如果您想忽略空白,为什么不在lexer步骤中完全删除它呢?它在你语法的其他地方有用吗?我宁愿对lexer进行一些修改,在一些标记后面加上一些空格标记,我知道它们很重要,也不愿让它们污染我的整个语法。当然,menhir允许定义参数化规则,这有助于以下未经测试的示例:
ws(rule):
| LIST(WS) result = rule LIST(WS) { result }