initial
This commit is contained in:
commit
bbd73d5f4a
6 changed files with 106 additions and 0 deletions
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
lexer.ml
|
||||||
|
parser.ml
|
||||||
|
parser.mli
|
||||||
|
*.cmo
|
||||||
|
*.cmi
|
||||||
|
|
28
Makefile
Normal file
28
Makefile
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
.PHONY: all clean
|
||||||
|
|
||||||
|
types.cmo: types.ml
|
||||||
|
ocamlc -o $@ -c $^
|
||||||
|
|
||||||
|
parser: parser.mly
|
||||||
|
ocamlyacc $^
|
||||||
|
|
||||||
|
parser.cmo: parser
|
||||||
|
ocamlc -c parser.mli
|
||||||
|
ocamlc -c parser.ml
|
||||||
|
|
||||||
|
lexer.cmo: lexer.ml
|
||||||
|
ocamlc -o $@ -c $^
|
||||||
|
|
||||||
|
lexer.ml: parser.cmo
|
||||||
|
ocamllex lexer.mll
|
||||||
|
|
||||||
|
lambda.cmo: lambda.ml
|
||||||
|
ocamlc -o $@ -c $^
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f lexer.ml parser.ml parser.mli
|
||||||
|
rm -f *.cmo *.cmi
|
||||||
|
|
||||||
|
all: types.cmo lexer.cmo parser.cmo lambda.cmo
|
||||||
|
ocaml types.cmo parser.cmo lexer.cmo lambda.cmo
|
||||||
|
|
26
lambda.ml
Normal file
26
lambda.ml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
open Lexer
|
||||||
|
open Lexing
|
||||||
|
open Parser
|
||||||
|
open Types
|
||||||
|
|
||||||
|
let rec string_of_term (t:term) =
|
||||||
|
match t with
|
||||||
|
| TmAbs(x, t1) ->
|
||||||
|
"(\\" ^ (String.make 1 x) ^ "." ^ (string_of_term t1) ^ ")"
|
||||||
|
| TmApp(t1, t2) ->
|
||||||
|
"(" ^ (string_of_term t1) ^ (string_of_term t2) ^ ")"
|
||||||
|
| TmVar(x) ->
|
||||||
|
String.make 1 x
|
||||||
|
|
||||||
|
let _ =
|
||||||
|
try
|
||||||
|
let rec loop ctx =
|
||||||
|
print_string "> "; flush stdout;
|
||||||
|
let lexbuf = Lexing.from_channel stdin in
|
||||||
|
let result = Parser.main Lexer.token lexbuf in
|
||||||
|
print_endline (string_of_term result); flush stdout;
|
||||||
|
loop ctx in
|
||||||
|
loop []
|
||||||
|
with Lexer.Eof ->
|
||||||
|
print_endline "error";
|
||||||
|
exit 0
|
12
lexer.mll
Normal file
12
lexer.mll
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
open Parser
|
||||||
|
exception Eof
|
||||||
|
}
|
||||||
|
|
||||||
|
rule token = parse
|
||||||
|
| ' ' | '\t' { token lexbuf }
|
||||||
|
| '\n' { EOL }
|
||||||
|
| '\\' { Lambda }
|
||||||
|
| '.' { Dot }
|
||||||
|
| ['a'-'z'] as c | ['A'-'Z'] as c { Ident(c) }
|
||||||
|
| eof { raise Eof }
|
25
parser.mly
Normal file
25
parser.mly
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
%{
|
||||||
|
open Types
|
||||||
|
%}
|
||||||
|
|
||||||
|
%token EOL
|
||||||
|
%token Dot
|
||||||
|
%token <char> Ident
|
||||||
|
%token Lambda
|
||||||
|
|
||||||
|
%start main
|
||||||
|
%type <Types.term> main
|
||||||
|
%%
|
||||||
|
|
||||||
|
main:
|
||||||
|
expr EOL { $1 }
|
||||||
|
;
|
||||||
|
expr:
|
||||||
|
| var { Types.TmVar($1) }
|
||||||
|
| Lambda var Dot expr { Types.TmAbs($2, $4) }
|
||||||
|
| expr expr { Types.TmApp ($1, $2) }
|
||||||
|
;
|
||||||
|
var:
|
||||||
|
Ident { $1 }
|
||||||
|
;
|
||||||
|
|
9
types.ml
Normal file
9
types.ml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
type term =
|
||||||
|
| TmVar of char
|
||||||
|
| TmAbs of char * term
|
||||||
|
| TmApp of term * term
|
||||||
|
|
||||||
|
type binding = NameBind
|
||||||
|
|
||||||
|
type context = (char * binding) list
|
||||||
|
|
Loading…
Reference in a new issue