File: parseMap.mll

package info (click to toggle)
herdtools7 7.58-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 19,732 kB
  • sloc: ml: 128,583; ansic: 3,827; makefile: 670; python: 407; sh: 212; awk: 14
file content (81 lines) | stat: -rw-r--r-- 3,109 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
(****************************************************************************)
(*                           the diy toolsuite                              *)
(*                                                                          *)
(* Jade Alglave, University College London, UK.                             *)
(* Luc Maranget, INRIA Paris-Rocquencourt, France.                          *)
(*                                                                          *)
(* Copyright 2015-present Institut National de Recherche en Informatique et *)
(* en Automatique and the authors. All rights reserved.                     *)
(*                                                                          *)
(* This software is governed by the CeCILL-B license under French law and   *)
(* abiding by the rules of distribution of free software. You can use,      *)
(* modify and/ or redistribute the software under the terms of the CeCILL-B *)
(* license as circulated by CEA, CNRS and INRIA at the following URL        *)
(* "http://www.cecill.info". We also give a copy in LICENSE.txt.            *)
(****************************************************************************)
{
  exception Error of string

  type func =
    | Appliable of string * string
    | Sequence of string list

  type t = {
    source : Archs.t;
    target : Archs.t;
    funcs : (string * func) list;
    conversions : (string * string) list
  }
}

let space = [' ' '\t' '\r']
let blank = (space | '\n')
let archname = ([ '0'-'9' 'a'-'z' 'A'-'Z'])*
let arrow = ("->" | "maps" space "to")
let colon = [':']

rule main = parse
| space* (archname as src) space+ "to" space+ (archname as tgt) space* '\n' blank*
    { let (l, f) = conv [] [] lexbuf in
      let (src,tgt) = match Archs.parse src,Archs.parse tgt with
	| Some s,Some t -> s,t
	| _ -> raise (Error "Source or target architecture unrecognized.")
      in {
	source = src;
	target = tgt;
        funcs = List.rev f;
        conversions = List.rev l
      }
    }
| "" {raise (Error "Source or target architecture unspecified.")}

and conv l f = parse
    | eof {(l,f)}
    | '"' ([^'"']* as left) '"' blank* arrow blank* '"' ([^'"']* as right) '"' blank*
	{
	  conv ((String.trim left, String.trim right)::l) f lexbuf
	}
    | '"' ([^'"']* as func) '"' blank* colon blank* '"' ([^'"']* as left) '"' blank* arrow blank* '"' ([^'"']* as right) '"' blank*
	{
	  conv l ((String.trim func, Appliable(String.trim left, String.trim right))::f) lexbuf
	}
    | '"' ([^'"']* as func) '"' blank* colon blank* '"' (([^'"']* blank* '|' blank*)* [^'"']* as seq) '"' blank*
	{
	  conv l ((String.trim func, Sequence(List.map (fun s -> String.trim s) (Misc.split_on_char '|' seq)))::f) lexbuf
	}
    | ("#"|"//") [^'\n']* '\n' { conv l f lexbuf }
    | "" {
      let last = match l with
      | [] -> "*start*"
      | (left,right)::_ ->
          Printf.sprintf "\"%s\" -> \"%s\"" left right in
      let msg =
        Printf.sprintf
          "Bad syntax in conversion rule, after %s" last in
      raise (Error msg)}

{

  let parse chin = main (Lexing.from_channel chin)

}