Parsing ocaml menhir解析器的生产量从未减少 我正在学习如何解析简单的程序。

Parsing ocaml menhir解析器的生产量从未减少 我正在学习如何解析简单的程序。,parsing,ocaml,menhir,Parsing,Ocaml,Menhir,这是我的雷克瑟 { open Parser exception SyntaxError of string } let white = [' ' '\t']+ let blank = ' ' let identifier = ['a'-'z'] rule token = parse | white {token lexbuf} (* skip whitespace *) | '-' { HYPHEN } | identifier { let buf = Buf

这是我的雷克瑟

{
open Parser
  exception SyntaxError of string
}

let white = [' ' '\t']+

let blank = ' '


let identifier = ['a'-'z']


rule token = parse
  | white {token lexbuf} (* skip whitespace *)
  | '-' { HYPHEN }
  | identifier {
    let buf = Buffer.create 64 in
    Buffer.add_string buf (Lexing.lexeme lexbuf);
    scan_string buf lexbuf;
    let content = (Buffer.contents  buf) in
    STRING(content)
  }
  | _ { raise (SyntaxError "Unknown stuff here") }

and scan_string buf = parse
  | ['a'-'z']+ {
    Buffer.add_string buf (Lexing.lexeme lexbuf);
    scan_string buf lexbuf
  }
  | eof { () }
我的“ast”:

我的解析器:

%token <string> STRING
%token HYPHEN

%start <Ast.t> yaml
%%

yaml:
  | scalar { $1 }
  | sequence {$1} 
  ;

sequence:
  | sequence_items {
    Ast.Array (List.rev $1)
  }
  ;

sequence_items:
   (* empty *) { [] }
  | sequence_items HYPHEN scalar {
    $3::$1

  };

scalar:
  | STRING { Ast.String $1 }  
  ;

我对解析相当陌生。为什么这一点从未减少?

您声明解析器的入口点被称为
main

%start <Ast.t> main
例如,请参见此处:

下面的现实世界OCaml链接还讨论了如何使用EOL,我认为这将解决您的问题


顺便说一句,用OCaml编写YAML解析器真是太酷了。如果开源,它将对社区真正有用。请注意,YAML是缩进敏感的,因此要用Menhir解析它,您需要使用lexer生成某种
INDENT
DEDENT
标记。此外,YAML是JSON的严格超集,这意味着从JSON子集开始然后扩展它可能(也可能不)有意义。真实世界的OCaml展示了如何使用Menhir编写JSON解析器:


我将
yaml
重命名为
main
,因为这是yaml解析器的开始,我已经在为基础知识而挣扎了D reduce问题源于
yaml
变体。我将尝试学习realworldocaml。谢谢,这确实是EOF做的!
Warning: production sequence -> sequence_items is never reduced.
Warning: in total, 1 productions are never reduced.
%start <Ast.t> main
parse_yaml: yaml EOF { $1 }