Tree 树描述的语法示例(lex/yacc)

Tree 树描述的语法示例(lex/yacc),tree,ocaml,grammar,ocamllex,menhir,Tree,Ocaml,Grammar,Ocamllex,Menhir,我想从一个描述这棵树的文件中解析一棵树(这实际上是一种分类法) 我正在寻找提供树描述的语法示例(最好是lex/yacc文件)。如果所描述的树不是二叉搜索树,而是每个节点(可能)都有几个子节点的树(称为族谱树?平面树?),那就更好了 理想情况下,如果这个lex/yacc实际上包含在一个OCaml库中,那将是完美的。但是任何关于树描述的好语法都会让我满意 我试图通过Google或Stackoverflow找到例子,但研究结果被解析树相关的问题淹没了。 我可以自己做一个语法,但我想先看看示例,以便有一

我想从一个描述这棵树的文件中解析一棵树(这实际上是一种分类法)

我正在寻找提供树描述的语法示例(最好是lex/yacc文件)。如果所描述的树不是二叉搜索树,而是每个节点(可能)都有几个子节点的树(称为族谱树?平面树?),那就更好了

理想情况下,如果这个lex/yacc实际上包含在一个OCaml库中,那将是完美的。但是任何关于树描述的好语法都会让我满意

我试图通过Google或Stackoverflow找到例子,但研究结果被解析树相关的问题淹没了。
我可以自己做一个语法,但我想先看看示例,以便有一个好的起点。

以下是我尝试创建的解析树的最小示例:

我假设树表示为\u节点(子节点(…)、其他子节点(…)、…)的名称。例如,这里有一个简单的树,有一个根和三片叶子:
根(第一片叶子(),第二片叶子(),第三片叶子())

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) }
type t = T of string * t list
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) }
汇编:

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()))";;

您应该使用与OCaml集成的ocamlex和menhir,而不是lex和yacc。如果不知道树文件的语法,我就帮不了你什么忙。别担心,我确实打算使用ocamlex/ocamlyacc(或者Menhir)。我只是在寻找关于树描述语法已经做过的事情(可能是使用lex/yacc,在这种情况下,我将把代码翻译成ocamlex/ocamlyacc);检查。我必须承认,我们考虑了一些额外的格式化情况,但这是另一种口味。