Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ocamlyacc中的空规则_Ocaml_Yacc - Fatal编程技术网

ocamlyacc中的空规则

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}

我有以下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}
                 ;

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 }