2014-12-20 5 views
1

В рамках школьного проекта я должен распознать .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?

ответ

1

Значение типа должно начинаться с Graph или Graph_node. Это совсем не так, как (string * string) list.

+0

Спасибо! По крайней мере, сейчас он компилируется, но когда я пытаюсь запустить программу, я получаю Fatal error: exception End_of_File. Как я могу это исправить? И как я могу увидеть, было ли создано дерево разбора? – user3450044

 Смежные вопросы

  • Нет связанных вопросов^_^