我想从描述这棵树的文件中解析一棵树(实际上是一种分类法)。
我正在寻找提供树木描述的语法示例(理想情况下是lex / yacc文件)。如果所描述的树不是二叉搜索树,而是树,其中每个节点(可能)有几个子节点(它被称为家族树?平面树?),那会更好。
理想情况下,如果此lex / yacc实际上包含在OCaml库中,那将是完美的。但是树形描述的任何好的语法都会让我满意。
我尝试通过Google或Stackoverflow查找示例,但研究结果却被解析树相关问题所淹没。 我可以自己做一个语法,但我想首先看一个例子,以便有一个很好的起点。
答案 0 :(得分:2)
这是我尝试创建解析树的最小示例:
我假设树被表示为name_of_the_node(child(...), other_child(...), ...)
。例如,这是一个简单的树,有一个根和3个叶子:root(first_leaf(), second_leaf(), third_leaf())
。
<强> lexer.mll 强>
{
open Parser
open Lexing
exception Bad_char of char
}
rule main = parse
| ' ' | '\t' | '\n' { main lexbuf }
| ',' { COMMA }
| '(' { LP }
| ')' { RP }
| ['a'-'z' '_']+ as s { IDENT s }
| _ as c { raise (Bad_char c) }
<强> parser.mly 强>
%{
open Tree
%}
%token <string> IDENT
%token COMMA LP RP
%start <Tree.t> tree
%%
tree:
label = IDENT LP children = separated_list(COMMA, tree) RP { T(label, children) }
<强> tree.ml 强>
type t = T of string * t list
编译:
ocamllex lexer.mll
ocamlc -c tree.ml
menhir --infer -v parser.mly
ocamlc -c parser.mli
ocamlc -c parser.ml
ocamlc -c lexer.ml
测试到顶级:
ocaml tree.cmo parser.cmo lexer.cmo
然后:
let tree_of_string s = Parser.tree Lexer.main (Lexing.from_string s);;
tree_of_string "toto (titi(), tata(tutu()))";;