Sen*_*eca 4 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 = 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 { () }
Run Code Online (Sandbox Code Playgroud)
我的“AST”:
type t =
    String of string
  | Array of t list
Run Code Online (Sandbox Code Playgroud)
我的解析器:
%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 }  
  ;
Run Code Online (Sandbox Code Playgroud)
我目前正处于要解析纯“字符串”,即“字符串”的
some text“数组”,即- item1 - item2.
当我用 Menhir 编译解析器时,我得到:
Warning: production sequence -> sequence_items is never reduced.
Warning: in total, 1 productions are never reduced.
Run Code Online (Sandbox Code Playgroud)
我对解析很陌生。为什么这永远不会减少?
您声明解析器的入口点被称为 main
%start <Ast.t> main
Run Code Online (Sandbox Code Playgroud)
但是我main在你的代码中看不到生产。也许入口点应该是yaml?如果更改了,错误是否仍然存在?
此外,尝试将EOF令牌添加到您的词法分析器和入门级产品中,如下所示:
parse_yaml: yaml EOF { $1 }
Run Code Online (Sandbox Code Playgroud)
例如,请参见此处:https : //github.com/Virum/compiler/blob/28e807b842bab5dcf11460c8193dd5b16674951f/grammar.mly#L56
下面的 Real World OCaml 链接也讨论了如何使用 EOL——我认为这将解决您的问题。
顺便说一句,你在 OCaml 中编写 YAML 解析器真的很酷。如果开源,它将对社区非常有用。需要注意的是YAML是压痕敏感,所以用巨石解析它,你将需要产生某种INDENT和DEDENT标记您的词法分析器。此外,YAML 是 JSON 的严格超集,这意味着从 JSON 子集开始然后扩展它可能(也可能没有)有意义。Real World OCaml 展示了如何使用 Menhir 编写 JSON 解析器:
https://dev.realworldocaml.org/16-parsing-with-ocamllex-and-menhir.html