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 }