В рамках школьного проекта я должен распознать .dot-файл и создать соответствующее дерево синтаксического разбора. Для достижения этой цели, я должен использовать ocamllex и ocamlyacc, которые, кого я имею трудности ...неправильный тип выражения на ocamlyacc
Это мой OCaml .mli типы файлов:
type id = string
and node = id
and attr = id * id
and attr_list = attr list list
and attr_stmt =
Graphs of (attr_list)
| Nodes of (attr_list)
| Edge of (attr_list)
and node_stmt = node * attr_list
and node_subgraph =
Node of (node)
| Subgraphs of (graph)
and edge_stmt = node_subgraph * (node_subgraph list) * attr_list
and stmt =
Node_stmt of (node_stmt)
| Edge_stmt of (edge_stmt)
| Attr_stmt of (attr_stmt)
| Attr of (attr)
| Subgraph of graph
and graph =
Graph_node of (node * stmt list)
| Graph of (stmt list);;
это мой лексический файл:
{
open Parser
}
rule token = parse
(* Espacements *)
| [ ' ' '\t' '\n']+ {token lexbuf}
(* *)
| "graph" {GRAPH}
| "subgraph" {SUBGRAPH}
| "--" {EDGE}
(* Délimiteurs *)
| "{" {LEFT_ACC}
| "}" {RIGHT_ACC}
| "(" {LEFT_PAR}
| ")" {RIGHT_PAR}
| "[" {LEFT_BRA}
| "]" {RIGHT_BRA}
| "," {COMMA}
| ";" {SEMICOLON}
| "=" {EQUAL}
| ":" {TWOPOINT}
| ['a'-'z''A'-'Z''0'-'9']* as id {ID (id)}
| eof { raise End_of_file }
и это мой не закончил Yacc файл:
%{
open Types
%}
%token <string> ID
%token <string> STR
%token GRAPH SUBGRAPH EDGE
%token LEFT_ACC RIGHT_ACC LEFT_PAR RIGHT_PAR LEFT_BRA RIGHT_BRA
%token COMME SEMICOLON EQUAL TWOPOINT EOF
%start main
%type <graph> main
%%
main:
graph EOF { $1 }
graph:
GRAPH ID LEFT_ACC content RIGHT_ACC {$4}
| GRAPH LEFT_ACC content RIGHT_ACC {$3}
subgraph:
SUBGRAPH ID LEFT_ACC content RIGHT_ACC {$4}
| SUBGRAPH LEFT_ACC content RIGHT_ACC {$3}
content:
| ID EDGE ID SEMICOLON {[($1,$3)]}
кажется достаточно для распознавания простых точек фил е как
graph D {
A -- B ;
}
Но когда я пытаюсь скомпилировать мой интерфейс парсера я получаю эту ошибку: Это выражение имеет тип «список , но выражение Ожидалось типа Types.graph (относится к ID EDGE ID SEMICOLON {[$1,$3)]}
линии)
Я не понимаю, потому что {[$ 1, $ 3]} имеет тип (string * string). И если мы ищем types.mli, который может быть графиком.
В противном случае, правильно ли я понял работу ocamllex и ocamlyacc?
Спасибо! По крайней мере, сейчас он компилируется, но когда я пытаюсь запустить программу, я получаю Fatal error: exception End_of_File. Как я могу это исправить? И как я могу увидеть, было ли создано дерево разбора? – user3450044