Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
294 commits
Select commit Hold shift + click to select a range
a7432f7
docs: add parser docs
Ycyken Oct 12, 2024
a4cdfdc
fix: parse_unary_chainl1, comparison operators parsing (<= < <>)
Ycyken Oct 13, 2024
bc2c215
tests: add parser tests, change factorial test to .ml
Ycyken Oct 13, 2024
d86e911
feat: add if parser
Ycyken Oct 13, 2024
be2651c
fix: delete outdated comments
p1onerka Oct 13, 2024
963cd8d
fix: edit parser logic slighgtly and rename functions to verbs
p1onerka Oct 13, 2024
cbe3906
feat: add new example
p1onerka Oct 13, 2024
574ffbe
fix: gleb is not loh anymore
p1onerka Oct 13, 2024
616b847
fix: change let to describe both functions and single values, functio…
p1onerka Oct 13, 2024
000b762
fix: refactor arch of parser
p1onerka Oct 13, 2024
f52642f
feat: add keywords
p1onerka Oct 13, 2024
d037c07
fix: smth
p1onerka Oct 14, 2024
03bc1a4
fix: edit parser
p1onerka Oct 14, 2024
362c148
fix: separated LetIn and Let
Ycyken Oct 14, 2024
bcefa9d
fix: change logic of parse
p1onerka Oct 14, 2024
c0c6b3a
feat: add mli file for parser and edit headers in tests
p1onerka Oct 14, 2024
e425c4b
fix: formatting
p1onerka Oct 14, 2024
eab3764
tests: add print ast tests for LetIn and Match
Ycyken Oct 14, 2024
1855d88
ref: remove unused functions and open
Ycyken Oct 14, 2024
183e4de
feat: add factorial to main.ml
Ycyken Oct 14, 2024
9b8f7b6
Merge branch 'master' into master
Ycyken Oct 14, 2024
3455a82
tests: remove old test
Ycyken Oct 14, 2024
54a24f1
ref: fix formatting
Ycyken Oct 14, 2024
e867705
feat: add possibility of digits in variable name
Ycyken Oct 15, 2024
c7b2fb6
fix: add whitespaces skip in integer and variable parsers
Ycyken Oct 15, 2024
89de711
feat: add parsing of unary operators
Ycyken Oct 16, 2024
c91ec5e
ref: formatting
Ycyken Oct 16, 2024
ee2f80c
fix: change deprecated functions
Ycyken Oct 16, 2024
e4ec029
fix: add possibility of sum with ite and LetIn
Ycyken Oct 18, 2024
cc6c42f
docs: fix Ast constructor docs
Ycyken Oct 18, 2024
b04f53a
fix: change function for identifiers parsing
p1onerka Oct 19, 2024
2bd0d1b
fix: replace unary operators after binary for correct work
p1onerka Oct 19, 2024
bb987f8
fix: delete self-application of if and let
p1onerka Oct 19, 2024
b478f3a
fix: change logic of p_apply so first function name will always be co…
p1onerka Oct 19, 2024
f69ec9b
fix: order of unary expressions and applying complex expressions
Ycyken Oct 20, 2024
fc9530b
fix: add tab and line break to skip_ws1 symbols
Ycyken Oct 20, 2024
7d21c5f
feat: implemented REPL
Ycyken Oct 20, 2024
556b172
fix: add flush stdout in REPL
Ycyken Oct 20, 2024
09ea9a0
fix: incorrect expr in ITE and parentheses parsing
Ycyken Oct 21, 2024
f1129ea
fix: change REPL logic
p1onerka Oct 21, 2024
8f00d13
ref: add types of run result in REPL
Ycyken Oct 21, 2024
1107f0b
fix: spaces after ;; in REPL
Ycyken Oct 21, 2024
033eb26
ref: fix fmt
Ycyken Oct 21, 2024
c39fca0
fix: add REPL run after emtpy input
Ycyken Oct 21, 2024
ce4d296
fix: print empty input to stdout in REPL
Ycyken Oct 21, 2024
11cf802
fix: empty print in REPL
Ycyken Oct 21, 2024
a1f1221
fix: exclude extra null literal
p1onerka Oct 21, 2024
b73cf64
fix: change arguments in LetIn from list option to list with empty l…
p1onerka Oct 21, 2024
9c5085a
fix: change arguments in Let from list option to list with empty list…
p1onerka Oct 21, 2024
0994fcc
ref: eta reduction
Ycyken Oct 21, 2024
2a53f82
fix: change printer output so it matches F# syntax, edit example
p1onerka Nov 8, 2024
40b3ad3
feat: implement parser for option and tuple, change corresponding pri…
p1onerka Nov 9, 2024
ba6538f
feat: implemet type cast to identifiers
p1onerka Nov 9, 2024
59e1677
feat: update example
p1onerka Nov 9, 2024
3ed7159
fix: print of booleans
p1onerka Nov 9, 2024
9a4f645
fix: formatting
p1onerka Nov 9, 2024
3358f17
fix: add equal sign
p1onerka Nov 10, 2024
466c283
feat: implement mutual recursion through and
p1onerka Nov 10, 2024
77dee16
feat: update example
p1onerka Nov 10, 2024
e573bcf
fix: formatting
p1onerka Nov 10, 2024
e7168f8
fix: add \n to printer
p1onerka Nov 10, 2024
11eb66b
feat: implement lists parser
p1onerka Nov 11, 2024
e70a5e4
fix: formatting
p1onerka Nov 11, 2024
b315f9b
feat: implemented basic qcheck
Ycyken Nov 9, 2024
f55b73f
tests: commented old tests
Ycyken Nov 9, 2024
a5d68be
fix: fix bin_expr printer
Ycyken Nov 9, 2024
a90612a
feat: implemented ITE and LetIn qcheck
Ycyken Nov 9, 2024
f993741
feat: implement some pretty_printer exprs, fix variable generator
Ycyken Nov 10, 2024
a3455fd
feat: split AstPrinter and PrettyPrinter, change REPL behaviour
Ycyken Nov 11, 2024
8726f4f
fix: parentheses in ITE pretty_printer
Ycyken Nov 11, 2024
576607f
fix: unary expression pretty_printer
Ycyken Nov 11, 2024
867dfd2
fix: tuple size in generator
Ycyken Nov 11, 2024
ea7bfce
feat: add Let to gen_construction
Ycyken Nov 11, 2024
c2e5017
feat: implement tuple pretty printer
Ycyken Nov 11, 2024
ccfb454
feat: implement basic func_call generator
Ycyken Nov 11, 2024
055b1bb
feat: change Let and LetIn AST
Ycyken Nov 11, 2024
69f9508
fix: let and letin pretty_printer
Ycyken Nov 11, 2024
352ab96
fix: func_call pretty printer
Ycyken Nov 11, 2024
bddc33c
feat: implement func_def shrinker
Ycyken Nov 11, 2024
1302880
ref: lint alerts
Ycyken Nov 11, 2024
71762cc
build: add qcheck dependency
Ycyken Nov 11, 2024
5ea1821
fix: resolve merge conflicts
p1onerka Nov 12, 2024
8a5f61f
fix: formatting
p1onerka Nov 12, 2024
eb46e16
build: fix qcheck dependencies
Ycyken Nov 12, 2024
239b067
ref: create gen_construction.mli
Ycyken Nov 12, 2024
6332019
build: fix qcheck dependencies
Ycyken Nov 12, 2024
f8bcebd
ref: fix release errors
Ycyken Nov 12, 2024
41a37b8
fix: fix bug in list parser, complete list pretty printer
p1onerka Nov 15, 2024
7bba637
fix: delete outdated functions from comments
p1onerka Nov 15, 2024
c583317
feat: add parser for match wildcard
p1onerka Nov 15, 2024
0f877ca
ref: remove old empty files
Ycyken Nov 15, 2024
452bc53
ref: formatting
Ycyken Nov 15, 2024
aa47ddb
fix: tuple parser: expressions inside tuple
Ycyken Nov 15, 2024
4941955
fix: Lambda pretty printer
Ycyken Nov 15, 2024
01f87d2
fix: renaming
Ycyken Nov 15, 2024
f1b3228
ref: less spaces in list pretty printer
Ycyken Nov 15, 2024
fc84a00
fix: expr shrinker
Ycyken Nov 15, 2024
0c8571f
fix: tuple ast printer
Ycyken Nov 15, 2024
0df8b43
ref: improve printers
Ycyken Nov 16, 2024
0d63e4d
feat: add @@deriving qcheck for ast
Ycyken Nov 16, 2024
0b29330
feat: implement lists, tuple and variables patterns parser
Ycyken Nov 16, 2024
62ff5c7
fix: add open KeywordChecker
Ycyken Nov 16, 2024
c62880f
feat: add more shrinkers
Ycyken Nov 16, 2024
c19aa0d
ref: remove unused function
Ycyken Nov 16, 2024
1a89bbf
fix: reduce deep of manual generator
Ycyken Nov 16, 2024
62c3e4b
fix: change auto gen_expr to manual in manual gen_statement
Ycyken Nov 16, 2024
67a84f4
feat: add const parsing to patterns (match), rework const parsing
p1onerka Nov 16, 2024
61c9649
fix: add separator to option parsing
p1onerka Nov 16, 2024
49ae652
fix: rewrite let and letin via let*
p1onerka Nov 17, 2024
49c3146
feat: add string parser
p1onerka Nov 17, 2024
e3d663e
fix: formatting
p1onerka Nov 17, 2024
96a68b7
fix: treat rec flag correctly
p1onerka Nov 17, 2024
f53cbc2
fix: edit print of pattern tuple
p1onerka Nov 17, 2024
9861db7
fix: formatting
p1onerka Nov 17, 2024
0e0ee34
fix: print of args in lambda
p1onerka Nov 17, 2024
4fa2703
feat: implement auto-derived qcheck
Ycyken Nov 17, 2024
19cdf1e
feat: add parser for lambda
p1onerka Nov 17, 2024
d95ae4d
feat: temporary remove Variants in Ast
Ycyken Nov 17, 2024
99fa873
feat: temporary remove ActivePatterns in Ast
Ycyken Nov 18, 2024
4964d23
feat: implement signed ints parser, change int generator to non negative
Ycyken Nov 18, 2024
15a864c
feat: improve Lambda shrinker
Ycyken Nov 18, 2024
f2a6d9c
feat: implement pattern shrinker
Ycyken Nov 18, 2024
eca52c3
fix: enable any expr inside of apply
p1onerka Nov 18, 2024
f464450
fix: add breackets to treat apply correctly
p1onerka Nov 18, 2024
4d476dd
ref: rename Function_def to Apply
Ycyken Nov 18, 2024
f99f3a1
feat: create general List type
Ycyken Nov 18, 2024
60377ed
fix: lists and string parsers
p1onerka Nov 18, 2024
1f75807
ref: delete outdated functions
p1onerka Nov 18, 2024
b643252
fix: add missing dependency
p1onerka Nov 18, 2024
2671d51
fix: new opam
p1onerka Nov 18, 2024
7f5eb61
fix: update test config
p1onerka Nov 18, 2024
4e93fba
fix: exclude unused declarations
p1onerka Nov 18, 2024
10340a9
fix: unused dependencies
p1onerka Nov 18, 2024
f198618
ref: eta reduction
p1onerka Nov 18, 2024
efd3c48
feat: expr and let_bind generators starts with small_nat
Ycyken Nov 18, 2024
aa53b8e
feat: implemet bit opers parsers
p1onerka Nov 18, 2024
02672d2
fix: boolean parsing
p1onerka Nov 18, 2024
3c1fa89
feat: string literal generator without double quotes and backslash
Ycyken Nov 18, 2024
d8c9120
fix: add breackets over fun
p1onerka Nov 18, 2024
990f781
feat: string generator generates small strings
Ycyken Nov 18, 2024
5d333e7
fix: parsing of option
p1onerka Nov 18, 2024
902c434
fix: pattern in match priority
p1onerka Nov 18, 2024
24bab47
fix: unit and if parsing
p1onerka Nov 18, 2024
d3031bf
feat: change match pretty printer
Ycyken Nov 18, 2024
1370805
feat: implement unary expression shrinker
Ycyken Nov 18, 2024
aed3f16
fix: match expr shrinker
Ycyken Nov 18, 2024
da35d77
fix: match inner expr parser
Ycyken Nov 18, 2024
27ecdd9
fix: remove skip_ws in the end of parsers
Ycyken Nov 18, 2024
4929201
ref: comment unused function
Ycyken Nov 19, 2024
0104f60
ref: remove manual generator
Ycyken Nov 19, 2024
c07ec79
ref: rename qcheck modules
Ycyken Nov 19, 2024
5ac344e
fix: cons list parser
Ycyken Nov 19, 2024
78f7b61
tests: reduced number of tests in qcheck.t
Ycyken Nov 19, 2024
4b68211
fix: match pretty printer
Ycyken Nov 21, 2024
029c5af
feat: add Option pattern and parentheses parsing in patterns
Ycyken Nov 21, 2024
c789176
fix: List expr and patterns generators was not sized
Ycyken Nov 21, 2024
4aeb7f0
fix: Option parsing - remove extra skip_ws
Ycyken Nov 21, 2024
939c059
fix: remove extra whitespaces skip in parsers
Ycyken Nov 21, 2024
f684cea
perf: reduces size of generated Ast
Ycyken Nov 22, 2024
5bc9047
feat: add weights in ident generator
Ycyken Nov 22, 2024
6076e3f
feat: implement escaped sequences parser
Ycyken Nov 22, 2024
f179b01
tests: implement string generator with escape sequences
Ycyken Nov 22, 2024
6dd7921
perf: reduce let size generation
Ycyken Nov 22, 2024
fa74321
fix: n delimeter for qcheck
p1onerka Nov 23, 2024
388d843
fix: list and cons parsers
Ycyken Nov 23, 2024
00644d5
fix: cons and list parser
p1onerka Nov 23, 2024
5174a16
feat: improve Let shrinker
Ycyken Nov 24, 2024
0c0a41d
fix: order of Application and Option
Ycyken Nov 24, 2024
167d86b
fix: Cons pattern pretty printer
Ycyken Nov 24, 2024
9e56615
ref: remove extra skip_ws
Ycyken Nov 24, 2024
636735f
ref: unified shrinkers style
Ycyken Nov 24, 2024
5cedc63
tests: change seed in qcheck.t
Ycyken Nov 24, 2024
8bc776d
tests: promote
Ycyken Nov 24, 2024
2f7807d
ref: remove deriving eq
Ycyken Nov 24, 2024
1317a26
tests: reduces size of expr generator
Ycyken Nov 24, 2024
3994991
ref: add empty mli for tests to show that nothing is public
p1onerka Nov 25, 2024
b3fbbb1
feat: add infer types, their prettyr printer and module R w comments …
p1onerka Nov 30, 2024
4323761
feat: substitution module with comments (to delete later)
p1onerka Nov 30, 2024
2d5b163
feat: add scheme and environment modules
p1onerka Nov 30, 2024
c5e49ec
feat: inferencer for constants and bin expr
p1onerka Nov 30, 2024
a0f3b09
feat: update REPL and example
p1onerka Nov 30, 2024
40018de
feat: implement ite and all binexpr operators inference
Ycyken Dec 7, 2024
64a6f4a
feat: implement some pattern and expr inference
Ycyken Dec 8, 2024
3e247ec
feat: change repl to print types
Ycyken Dec 8, 2024
9306e03
fix: arrow of many types constructor and lambda inference
Ycyken Dec 8, 2024
daaafbc
feat: add tuple, list, option inference
Ycyken Dec 9, 2024
fdf86d3
ref: fail errors
Ycyken Dec 9, 2024
a353624
feat: implement cons, list and tuple patterns
Ycyken Dec 9, 2024
3415edf
feat: mli for typedTree
p1onerka Dec 9, 2024
21fe543
fix: call of helper in pp
p1onerka Dec 9, 2024
26e76a4
ref: formatting
p1onerka Dec 9, 2024
f5b2fa3
fix: implement substitution for all types
Ycyken Dec 9, 2024
66481bd
feat: inferencer.mli
Ycyken Dec 9, 2024
c8d1451
lint: unused value
Ycyken Dec 9, 2024
c9099ab
resolve merge conflics
Ycyken Dec 9, 2024
bdbd9a5
resolve merge conflics
Ycyken Dec 9, 2024
bd52657
Merge remote-tracking branch 'kakadu/master' into 'master'
Ycyken Dec 11, 2024
a2bf023
ref: eta reduction
Ycyken Dec 14, 2024
0053cad
feat: implement LetIn inference
Ycyken Dec 15, 2024
96cd905
ref: move duplicated code to functions
Ycyken Dec 15, 2024
87feba2
ref: move function from mutual recursion definition
Ycyken Dec 15, 2024
283f3cb
fix: Let bind inference with arguments
Ycyken Dec 15, 2024
3ee7bcb
feat: implement Let statements inference, REPL with TypeEnvironment
Ycyken Dec 15, 2024
8d3d4c0
ref: remove old comments
Ycyken Dec 15, 2024
a2325ad
fix: inference of Let with shadowing
Ycyken Dec 15, 2024
41d269b
fix: recursive generalize
Ycyken Dec 16, 2024
c98aed7
fix: REPL now runs with new state
Ycyken Dec 16, 2024
82af8dd
fix: extend env in let rec
Ycyken Dec 16, 2024
42cd949
fix: apply parser
Ycyken Dec 16, 2024
c685d44
feat: implement match inference
Ycyken Dec 16, 2024
d7f8d4a
fix: let bind inference
Ycyken Dec 16, 2024
1d8c2bb
ref: lint and fmt
Ycyken Dec 16, 2024
dfd1cd6
ref: eta reduction
Ycyken Dec 16, 2024
81f9b5d
fix: let binds like 'let rec x = x + 1'
Ycyken Dec 17, 2024
d89efce
feat: add function
Ycyken Dec 17, 2024
ce170e8
ref: add type case = pattern * expr
Ycyken Dec 18, 2024
03d8ace
feat: infix operators
p1onerka Dec 18, 2024
cd6d661
feat: implement patterns in let bindings
Ycyken Dec 18, 2024
ff2e6e8
ref: lint
Ycyken Dec 18, 2024
bc17a10
fix: tuple inference
Ycyken Dec 18, 2024
c7c9b84
fix: recursive let inference
Ycyken Dec 19, 2024
772da42
feat: tuples without parens
p1onerka Dec 19, 2024
3de17d7
fix: tuples without parens + example
p1onerka Dec 19, 2024
95383d0
fix: add '->' to keywords
Ycyken Dec 19, 2024
98205d8
fix: add '|' in keywords and add operator keywords check
Ycyken Dec 19, 2024
d55d260
ref: tuple parser
Ycyken Dec 19, 2024
4ff74b0
feat: add print_int to start environment
Ycyken Dec 19, 2024
307b490
fix: application and if in semicolon list
p1onerka Dec 19, 2024
2e5e553
fix: option in tuple + example
p1onerka Dec 19, 2024
949735a
feat: types in arguments of application
Ycyken Dec 19, 2024
13cdbb3
feat: match with single argument
p1onerka Dec 19, 2024
3a6b877
feat: first case in function and match
p1onerka Dec 19, 2024
9a8fe99
fix: order of application and tuple
Ycyken Dec 19, 2024
85859dc
fix: -dparsetree option in REPL
Ycyken Dec 19, 2024
47d4e7f
fix: generalizing in type inference
Ycyken Dec 19, 2024
4b00ecb
ref: pattern parser
Ycyken Dec 19, 2024
77e8a80
fix: match inference
Ycyken Dec 19, 2024
ae6a45e
fix: LetIn inference
Ycyken Dec 19, 2024
6812d40
feat: implement pattern and expr Constraints
Ycyken Dec 19, 2024
0dea5ce
fix: Expr constraint parser
Ycyken Dec 19, 2024
3861f5a
fix: Pattern constraint parser
Ycyken Dec 19, 2024
28b442d
fix: types pretty printer
Ycyken Dec 19, 2024
303d05f
feat: input file now works without delimiters
Ycyken Dec 19, 2024
c5ee4e3
merge kakadu/master into typecheck
Ycyken Dec 20, 2024
fe8a024
feat: add cram tests for inferencer
Ycyken Dec 20, 2024
074733b
feat: implement REPL with indents, printing of names
Ycyken Dec 20, 2024
034a122
fix: add subst returning in LetIn inference
Ycyken Dec 20, 2024
43db105
fix: and parsing in REPL
p1onerka Dec 20, 2024
04c6682
fix: CI to not analyze symbolic links to tests
p1onerka Dec 20, 2024
29203ec
debug: temporarily comment latest changes
p1onerka Dec 20, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions .github/workflows/PRformat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
pull_request:
branches:
- 'master'
- 'test-fix' #debug

env:
OPAMROOT: /home/user/.opam
Expand Down Expand Up @@ -35,15 +36,16 @@ jobs:
############# Detecting and compiling fp2024
# Smart link about setting environment variables
# https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable
- name: Detect latest changes
run: |
opam exec -- ocaml .github/detect_latest_pr.ml -v "pull/${{ steps.branch-name.outputs.ref_branch }}" -repo ${{ github.event.repository.name }} >> $GITHUB_ENV
echo "${{ env.latest }}"
# DEBUG TO UNCOMMENT BEFORE PR
# - name: Detect latest changes
# run: |
# opam exec -- ocaml .github/detect_latest_pr.ml -v "pull/${{ steps.branch-name.outputs.ref_branch }}" -repo ${{ github.event.repository.name }} >> $GITHUB_ENV
# echo "${{ env.latest }}"

- name: Naive linting
run: |
cd ${{ env.latest }}
python ../.github/lint_filesystem.py ${{ env.latest }}
find . -type l -name 'manytests' -prune -o -type f -exec python ../.github/lint_filesystem.py {} \;

# - name: Checking ocamlformat
# id: check-ocamlformat
Expand All @@ -59,7 +61,8 @@ jobs:
- name: Checking ocamlformat
run: |
cd ${{ env.latest }}
opam exec -- dune build @fmt --profile=release
find . -type l -name 'manytests' -prune -o -type f -exec opam exec -- dune build @fmt --profile=release {} \;



# TODO: onfail post a comment how to fix it
Expand Down
94 changes: 73 additions & 21 deletions FSharpActivePatterns/bin/REPL.ml
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,19 @@

open FSharpActivePatterns.AstPrinter
open FSharpActivePatterns.Parser
open FSharpActivePatterns.Inferencer
open FSharpActivePatterns.TypedTree
open FSharpActivePatterns.TypesPp
open FSharpActivePatterns.Ast
open FSharpActivePatterns.PrettyPrinter
open Stdlib

type input =
| Input of string
| EOF

type 'a run_result =
| Result of 'a
| Fail
type run_result =
| Result of (construction, string) result
| Empty
| End

Expand Down Expand Up @@ -41,44 +44,93 @@ let input_upto_sep sep ic =
fill_buffer buffer
;;

let input_with_indents ic =
let take_line () = In_channel.input_line ic in
let rec fill_buffer b =
let start_pos = pos_in ic in
let line = take_line () in
match line with
| None -> Input (Buffer.contents b)
| Some line ->
let is_empty = String.length line = 0 in
let is_continue =
List.exists (fun pref -> String.starts_with ~prefix:pref line) [ " "; "\t"; "\n" ]
|| is_empty
|| String.starts_with ~prefix:"and" (String.trim line)
in
(match is_continue with
| true ->
let newline = " " ^ line in
Buffer.add_string b newline;
Buffer.add_string b "\n";
fill_buffer b
| false ->
seek_in ic start_pos;
Buffer.add_string b "\n";
Input (Buffer.contents b))
in
let buffer = Buffer.create 1024 in
let first_line = take_line () in
match first_line with
| None ->
EOF
| Some first_line ->
Buffer.add_string buffer first_line;
fill_buffer buffer
;;

let run_single ic =
match input_upto_sep ";;" ic with
let input =
match ic with
| None -> input_upto_sep ";;" stdin
| Some ic -> input_with_indents ic
in
match input with
| EOF -> End
| Input input ->
let trimmed_input = String.trim input in
if trimmed_input = ""
then Empty
else (
match parse trimmed_input with
| Some ast -> Result ast
| None -> Fail)
if trimmed_input = "" then Empty else Result (parse trimmed_input)
;;

let run_repl dump_parsetree input_file =
let ic =
match input_file with
| None -> stdin
| Some n -> open_in n
| None -> None
| Some n -> Some (open_in n)
in
let rec run_repl_helper run =
let rec run_repl_helper run env state =
let open Format in
match run ic with
| Fail -> fprintf err_formatter "Error occured\n"
| Result (Error e) -> fprintf err_formatter "%s\n" e
| Empty ->
fprintf std_formatter "\n";
print_flush ();
run_repl_helper run
run_repl_helper run env state
| End -> ()
| Result ast ->
| Result (Ok ast) ->
(match dump_parsetree with
| true -> print_construction std_formatter ast
| false ->
fprintf std_formatter "- : ";
pp_construction std_formatter ast);
print_flush ();
run_repl_helper run
let result = infer ast env state in
(match result with
| new_state, Error err ->
fprintf err_formatter "Type checking failed: %a\n" pp_error err;
print_flush ();
run_repl_helper run env new_state
| new_state, Ok (env, names_and_types) ->
List.iter
(fun (n, t) -> fprintf std_formatter "%s : %a" n pp_typ t)
names_and_types;
print_flush ();
run_repl_helper run env new_state))
in
let env =
TypeEnvironment.extend
TypeEnvironment.empty
"print_int"
(Scheme (VarSet.empty, Arrow (int_typ, unit_typ)))
in
run_repl_helper run_single
run_repl_helper run_single env 0
;;

type opts =
Expand Down
2 changes: 1 addition & 1 deletion FSharpActivePatterns/bin/dune
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
(executable
(public_name repl)
(name REPL)
(libraries FSharpActivePatterns stdlib)
(libraries FSharpActivePatterns stdlib str)
(instrumentation
(backend bisect_ppx)))
48 changes: 41 additions & 7 deletions FSharpActivePatterns/bin/input.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,41 @@
let rec even n =
if n = 0 then true
else odd (n - 1)
and odd n : int =
if n = 0 then false
else even (n - 1)
;;
let rec length xs =
match xs with
| [] -> 0
| h::tl -> 1 + length tl

let length_tail =
let rec helper acc xs =
match xs with
| [] -> acc
| h::tl -> helper (acc + 1) tl
in
helper 0

let rec map f xs =
match xs with
| [] -> []
| a::[] -> [f a]
| a::b::[] -> [f a; f b]
| a::b::c::[] -> [f a; f b; f c]
| a::b::c::d::tl -> f a :: f b :: f c :: f d :: map f tl

let rec append xs ys = match xs with [] -> ys | x::xs -> x::(append xs ys)

let concat =
let rec helper xs =
match xs with
| [] -> []
| h::tl -> append h (helper tl)
in helper

let rec iter f xs = match xs with [] -> () | h::tl -> let () = f h in iter f tl

let rec cartesian xs ys =
match xs with
| [] -> []
| h::tl -> append (map (fun a -> (h,a)) ys) (cartesian tl ys)

let main =
let () = iter print_int [1;2;3] in
let () = print_int (length (cartesian [1;2] [1;2;3;4])) in
0
41 changes: 24 additions & 17 deletions FSharpActivePatterns/lib/ast.ml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
(** SPDX-License-Identifier: LGPL-3.0-or-later *)

open KeywordChecker
open TypedTree

type ident = Ident of string * string option (** identifier *)
[@@deriving show { with_path = false }]
type ident = Ident of string (** identifier *) [@@deriving show { with_path = false }]

let gen_varname =
let open QCheck.Gen in
Expand All @@ -26,8 +26,8 @@ let gen_varname =
loop >>= fun name -> if is_keyword name then loop else return name
;;

let gen_ident = QCheck.Gen.map (fun s -> Ident (s, None)) gen_varname
let gen_ident_small_list = QCheck.Gen.(list_size (0 -- 3) gen_ident)
let gen_ident = QCheck.Gen.map (fun s -> Ident s) gen_varname
(* let gen_ident_small_list = QCheck.Gen.(list_size (0 -- 3) gen_ident) *)

let gen_escape_sequence =
let open QCheck.Gen in
Expand Down Expand Up @@ -98,15 +98,21 @@ type pattern =
| PConst of literal (** | [4] -> *)
| PVar of ident (** pattern identifier *)
| POption of pattern option
(*| Variant of (ident list[@gen gen_ident_small_list]) (** | [Blue, Green, Yellow] -> *) *)
(*| Variant of (ident list[@gen gen_ident_small_list]) (** | [Blue, Green, Yellow] -> *) *)
| PConstraint of pattern * (typ[@gen gen_typ_sized (n / 4)])
[@@deriving show { with_path = false }, qcheck]

let gen_typed_pattern_sized n = QCheck.Gen.(pair (gen_pattern_sized n) (return None))

type is_recursive =
| Nonrec (** let factorial n = ... *)
| Rec (** let rec factorial n = ... *)
[@@deriving show { with_path = false }, qcheck]

type expr =
type case = (pattern[@gen gen_pattern_sized n]) * (expr[@gen gen_expr_sized n])
[@@deriving show { with_path = false }, qcheck]

and expr =
| Const of literal (** [Int], [Bool], [String], [Unit], [Null] *)
| Tuple of
(expr[@gen gen_expr_sized (n / 4)])
Expand All @@ -129,29 +135,30 @@ type expr =
* expr (** fun x y -> x + y *)
| Apply of (expr[@gen gen_expr_sized (n / 4)]) * (expr[@gen gen_expr_sized (n / 4)])
(** [sum 1 ] *)
| Function of
(case[@gen gen_case_sized (n / 4)])
* (case list[@gen QCheck.Gen.(list_size (0 -- 2) (gen_case_sized (n / 20)))])
(** [function | p1 -> e1 | p2 -> e2 | ... |]*)
| Match of
(expr[@gen gen_expr_sized (n / 4)])
* (pattern[@gen gen_pattern_sized (n / 4)])
* (expr[@gen gen_expr_sized (n / 4)])
* ((pattern * expr) list
[@gen
QCheck.Gen.(
list_size
(0 -- 2)
(pair (gen_pattern_sized (n / 20)) (gen_expr_sized (n / 20))))])
(** [match x with | x -> ... | y -> ...] *)
* (case[@gen gen_case_sized (n / 4)])
* (case list[@gen QCheck.Gen.(list_size (0 -- 2) (gen_case_sized (n / 20)))])
(** [match x with | p1 -> e1 | p2 -> e2 | ...] *)
| LetIn of
is_recursive
* let_bind
* (let_bind list
[@gen QCheck.Gen.(list_size (0 -- 2) (gen_let_bind_sized (n / 20)))])
* expr (** [let rec f x = if (x <= 0) then x else g x and g x = f (x-2) in f 3] *)
| Option of expr option (** [int option] *)
| EConstraint of expr * (typ[@gen gen_typ_sized (n / 4)])
[@@deriving show { with_path = false }, qcheck]

and let_bind =
| Let_bind of ident * (ident list[@gen gen_ident_small_list]) * expr
(** [and sum n m = n+m] *)
| Let_bind of
(pattern[@gen gen_pattern_sized (n / 2)])
* (pattern list[@gen QCheck.Gen.(list_size (0 -- 3) (gen_pattern_sized (n / 4)))])
* expr (** [let sum n m = n + m] *)
[@@deriving show { with_path = false }, qcheck]

let gen_expr =
Expand Down
Loading
Loading