私は単純なプログラムを解析する方法を学ぶ途中です。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 {() }
マイ "AST":
type t =
String of string
| Array of t list
マイパーサ:
%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 }
;
私は無地の '文字列' を解析するためにどちらかたいポイントで、現在よ、すなわち some text
または '文字列'の '配列'、つまり- item1 - item2
です。私は立石とパーサをコンパイルすると
は私が取得:
Warning: production sequence -> sequence_items is never reduced.
Warning: in total, 1 productions are never reduced.
私は構文解析にかなり新しいです。なぜこれは決して減らされませんか?
これはYAMLパーサの冒頭で、私はすでに非常に基本的に苦しんだので、私は、 '' main'にyaml'と改名しました。 :D reduce問題は 'yaml'変種から発生します。 私はrealworldocamlを試してみよう。 – Seneca
@Seneca私の更新された答えを見てください。 – Halst
本当にそれをしたEOFでした! – Seneca