emfrp 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +45 -12
- data/bin/emfrp +4 -1
- data/examples/LCDClock/LCDClock.mfrp +93 -93
- data/examples/LCDClock/LCDClock_LPC1768.bin +0 -0
- data/examples/LCDClock/README.md +24 -24
- data/examples/LCDPositioner/LCDPositioner.mfrp +30 -30
- data/examples/LCDPositioner/LCDPositionerMain.c +15 -15
- data/examples/MostDistantPoint/MostDistantPoint.mfrp +25 -25
- data/examples/MostDistantPoint/MostDistantPointMain.c +14 -14
- data/lib/emfrp/compile/c/alloc.rb +200 -200
- data/lib/emfrp/compile/c/codegen.rb +18 -18
- data/lib/emfrp/compile/c/codegen_context.rb +218 -218
- data/lib/emfrp/compile/c/monofy.rb +185 -185
- data/lib/emfrp/compile/c/syntax_codegen.rb +364 -364
- data/lib/emfrp/compile/c/syntax_exp_codegen.rb +119 -119
- data/lib/emfrp/compile/graphviz/graphviz.rb +53 -53
- data/lib/emfrp/compile_error.rb +95 -95
- data/lib/emfrp/interpreter/command_manager.rb +367 -367
- data/lib/emfrp/interpreter/evaluater.rb +146 -146
- data/lib/emfrp/interpreter/file_loader.rb +52 -52
- data/lib/emfrp/interpreter/interpreter.rb +200 -195
- data/lib/emfrp/parser/expression.rb +386 -386
- data/lib/emfrp/parser/misc.rb +184 -184
- data/lib/emfrp/parser/newnode_convert.rb +72 -72
- data/lib/emfrp/parser/operator.rb +25 -25
- data/lib/emfrp/parser/parser.rb +150 -150
- data/lib/emfrp/parser/parsing_error.rb +49 -49
- data/lib/emfrp/parser/toplevel.rb +555 -555
- data/lib/emfrp/pre_convert/pre_convert.rb +32 -32
- data/lib/emfrp/syntax.rb +171 -171
- data/lib/emfrp/typing/typing_error.rb +47 -47
- data/lib/emfrp/typing/union_type.rb +197 -197
- data/lib/emfrp/version.rb +1 -1
- data/mfrp_include/Std.mfrp +122 -122
- data/tests/Rakefile +8 -8
- data/tests/Rakefile.common +27 -27
- data/tests/command/Rakefile +2 -2
- data/tests/command/ReplaceNode.mfrp +39 -39
- data/tests/compiler/ComplexDataType/ComplexDataType.mfrp +14 -14
- data/tests/compiler/ComplexDataType/ComplexDataTypeMain.c +15 -15
- data/tests/compiler/ComplexDataType/Rakefile +2 -2
- data/tests/compiler/ComplexDataType/expected_out.txt +0 -0
- data/tests/compiler/ComplexDataType/in.txt +5 -5
- data/tests/compiler/LCDClock/LCDClock.mfrp +90 -90
- data/tests/compiler/LCDClock/LCDClockMain.c +0 -0
- data/tests/compiler/LCDClock/Rakefile +2 -2
- data/tests/compiler/LCDClock/expected_out.txt +0 -0
- data/tests/compiler/LCDClock/in.txt +0 -0
- data/tests/compiler/LCDPositioner/LCDPositioner.mfrp +30 -30
- data/tests/compiler/LCDPositioner/LCDPositionerMain.c +15 -15
- data/tests/compiler/LCDPositioner/Rakefile +2 -2
- data/tests/compiler/LCDPositioner/graph.dot +0 -0
- data/tests/compiler/LCDPositioner/graph.png +0 -0
- data/tests/compiler/Rakefile +8 -8
- data/tests/compiler/Rakefile.common +23 -23
- data/tests/compiler/UseData/Rakefile +2 -2
- data/tests/compiler/UseData/UseData.mfrp +8 -8
- data/tests/compiler/UseSubModule/Rakefile +2 -2
- data/tests/compiler/UseSubModule/SubModule.mfrp +8 -8
- data/tests/compiler/UseSubModule/SubModule2.mfrp +5 -5
- data/tests/compiler/UseSubModule/UseSubModule.mfrp +11 -11
- data/tests/core/FromAnnotation.mfrp +18 -18
- data/tests/core/Last.mfrp +10 -10
- data/tests/core/Rakefile +2 -2
- data/tests/core/TypingTest.mfrp +11 -11
- data/tests/core/WithoutInputs.mfrp +19 -19
- data/tests/load_time_error/Rakefile +32 -32
- data/tests/load_time_error/TypeMismatch.mfrp +4 -4
- metadata +3 -3
    
        data/tests/Rakefile.common
    CHANGED
    
    | @@ -1,27 +1,27 @@ | |
| 1 | 
            -
            $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
         | 
| 2 | 
            -
            require 'emfrp'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            TARGETS = Dir.glob("./*.mfrp").map{|x| x =~ /^\.\/(.*).mfrp$/; $1}
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            def exec_test(file_name)
         | 
| 7 | 
            -
              puts "TESTING #{file_name}".colorize(:light_blue)
         | 
| 8 | 
            -
              inter = Emfrp::Interpreter.new(Emfrp::IncludeDirs, STDOUT, file_name)
         | 
| 9 | 
            -
              unless inter.exec_embedded_commands(true)
         | 
| 10 | 
            -
                puts " => ok".colorize(:green)
         | 
| 11 | 
            -
              else
         | 
| 12 | 
            -
                puts " => fail".colorize(:red)
         | 
| 13 | 
            -
              end
         | 
| 14 | 
            -
            rescue => err
         | 
| 15 | 
            -
              puts err.inspect
         | 
| 16 | 
            -
              puts " => fail".colorize(:red)
         | 
| 17 | 
            -
            end
         | 
| 18 | 
            -
             | 
| 19 | 
            -
            TARGETS.each do |t|
         | 
| 20 | 
            -
              file t do
         | 
| 21 | 
            -
                exec_test(t)
         | 
| 22 | 
            -
              end
         | 
| 23 | 
            -
            end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
            file "Std" do
         | 
| 26 | 
            -
              exec_test("Std")
         | 
| 27 | 
            -
            end
         | 
| 1 | 
            +
            $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
         | 
| 2 | 
            +
            require 'emfrp'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            TARGETS = Dir.glob("./*.mfrp").map{|x| x =~ /^\.\/(.*).mfrp$/; $1}
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            def exec_test(file_name)
         | 
| 7 | 
            +
              puts "TESTING #{file_name}".colorize(:light_blue)
         | 
| 8 | 
            +
              inter = Emfrp::Interpreter.new(Emfrp::IncludeDirs, STDOUT, file_name)
         | 
| 9 | 
            +
              unless inter.exec_embedded_commands(true)
         | 
| 10 | 
            +
                puts " => ok".colorize(:green)
         | 
| 11 | 
            +
              else
         | 
| 12 | 
            +
                puts " => fail".colorize(:red)
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            rescue => err
         | 
| 15 | 
            +
              puts err.inspect
         | 
| 16 | 
            +
              puts " => fail".colorize(:red)
         | 
| 17 | 
            +
            end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            TARGETS.each do |t|
         | 
| 20 | 
            +
              file t do
         | 
| 21 | 
            +
                exec_test(t)
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            file "Std" do
         | 
| 26 | 
            +
              exec_test("Std")
         | 
| 27 | 
            +
            end
         | 
    
        data/tests/command/Rakefile
    CHANGED
    
    | @@ -1,2 +1,2 @@ | |
| 1 | 
            -
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| 2 | 
            -
            task :default => TARGETS
         | 
| 1 | 
            +
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| 2 | 
            +
            task :default => TARGETS
         | 
| @@ -1,39 +1,39 @@ | |
| 1 | 
            -
            module ReplaceNodeCommand in x : Int out y use Std
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            node a = x + 1
         | 
| 4 | 
            -
            node b = a + 1
         | 
| 5 | 
            -
            node c = b + 1
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            node i = x + 2
         | 
| 8 | 
            -
            node j = i + 2
         | 
| 9 | 
            -
            node k = j + 2
         | 
| 10 | 
            -
             | 
| 11 | 
            -
            node z = 1.0
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            node init[0] p = 1
         | 
| 14 | 
            -
            node q = 0
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            node y = c
         | 
| 17 | 
            -
             | 
| 18 | 
            -
            #@ :assert-error replace_node_err1 =>
         | 
| 19 | 
            -
            #-   :replace-node hoge => b
         | 
| 20 | 
            -
             | 
| 21 | 
            -
            #@ :assert-error replace_node_err2 =>
         | 
| 22 | 
            -
            #-   :replace-node b => hoge
         | 
| 23 | 
            -
             | 
| 24 | 
            -
            #@ :assert-error replace_node_err3 =>
         | 
| 25 | 
            -
            #-   :replace-node b => z
         | 
| 26 | 
            -
             | 
| 27 | 
            -
            #@ :assert-error replace_node_err4 =>
         | 
| 28 | 
            -
            #-   :replace-node c => b
         | 
| 29 | 
            -
             | 
| 30 | 
            -
            #@ :assert-error replace_node_err4 =>
         | 
| 31 | 
            -
            #-   :replace-node a => b
         | 
| 32 | 
            -
             | 
| 33 | 
            -
            #@ :assert-error replace_node_err5 =>
         | 
| 34 | 
            -
            #-   :replace-node p => q
         | 
| 35 | 
            -
             | 
| 36 | 
            -
            #@ :replace-node b => j
         | 
| 37 | 
            -
            #@ :assert-module
         | 
| 38 | 
            -
            #-   0 => 5
         | 
| 39 | 
            -
            #@ : 1 => 6
         | 
| 1 | 
            +
            module ReplaceNodeCommand in x : Int out y use Std
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            node a = x + 1
         | 
| 4 | 
            +
            node b = a + 1
         | 
| 5 | 
            +
            node c = b + 1
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            node i = x + 2
         | 
| 8 | 
            +
            node j = i + 2
         | 
| 9 | 
            +
            node k = j + 2
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            node z = 1.0
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            node init[0] p = 1
         | 
| 14 | 
            +
            node q = 0
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            node y = c
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            #@ :assert-error replace_node_err1 =>
         | 
| 19 | 
            +
            #-   :replace-node hoge => b
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            #@ :assert-error replace_node_err2 =>
         | 
| 22 | 
            +
            #-   :replace-node b => hoge
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            #@ :assert-error replace_node_err3 =>
         | 
| 25 | 
            +
            #-   :replace-node b => z
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            #@ :assert-error replace_node_err4 =>
         | 
| 28 | 
            +
            #-   :replace-node c => b
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            #@ :assert-error replace_node_err4 =>
         | 
| 31 | 
            +
            #-   :replace-node a => b
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            #@ :assert-error replace_node_err5 =>
         | 
| 34 | 
            +
            #-   :replace-node p => q
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            #@ :replace-node b => j
         | 
| 37 | 
            +
            #@ :assert-module
         | 
| 38 | 
            +
            #-   0 => 5
         | 
| 39 | 
            +
            #@ : 1 => 6
         | 
| @@ -1,14 +1,14 @@ | |
| 1 | 
            -
            module ComplexDataType
         | 
| 2 | 
            -
            in i : Int
         | 
| 3 | 
            -
            out out1, out2
         | 
| 4 | 
            -
            use Std
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            node x = ((i, i), (i, i), (i, i))
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            node y = {
         | 
| 9 | 
            -
              ii = i.intToDouble
         | 
| 10 | 
            -
              ((ii, ii), (ii, ii), (ii, ii))
         | 
| 11 | 
            -
            }
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            node out1 = x of ((a, _), _, _) -> a
         | 
| 14 | 
            -
            node out2 = y of ((a, _), _, _) -> a
         | 
| 1 | 
            +
            module ComplexDataType
         | 
| 2 | 
            +
            in i : Int
         | 
| 3 | 
            +
            out out1, out2
         | 
| 4 | 
            +
            use Std
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            node x = ((i, i), (i, i), (i, i))
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            node y = {
         | 
| 9 | 
            +
              ii = i.intToDouble
         | 
| 10 | 
            +
              ((ii, ii), (ii, ii), (ii, ii))
         | 
| 11 | 
            +
            }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            node out1 = x of ((a, _), _, _) -> a
         | 
| 14 | 
            +
            node out2 = y of ((a, _), _, _) -> a
         | 
| @@ -1,15 +1,15 @@ | |
| 1 | 
            -
            #include "ComplexDataType.h"
         | 
| 2 | 
            -
            #include <stdio.h>
         | 
| 3 | 
            -
            #include <stdlib.h>
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            void Input(int* i) {
         | 
| 6 | 
            -
              if (scanf("%d", i) == EOF) {
         | 
| 7 | 
            -
                exit(0);
         | 
| 8 | 
            -
              }
         | 
| 9 | 
            -
            }
         | 
| 10 | 
            -
            void Output(int* out1, double* out2) {
         | 
| 11 | 
            -
              printf("%d %.3lf\n", *out1, *out2);
         | 
| 12 | 
            -
            }
         | 
| 13 | 
            -
            int main() {
         | 
| 14 | 
            -
              ActivateComplexDataType();
         | 
| 15 | 
            -
            }
         | 
| 1 | 
            +
            #include "ComplexDataType.h"
         | 
| 2 | 
            +
            #include <stdio.h>
         | 
| 3 | 
            +
            #include <stdlib.h>
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            void Input(int* i) {
         | 
| 6 | 
            +
              if (scanf("%d", i) == EOF) {
         | 
| 7 | 
            +
                exit(0);
         | 
| 8 | 
            +
              }
         | 
| 9 | 
            +
            }
         | 
| 10 | 
            +
            void Output(int* out1, double* out2) {
         | 
| 11 | 
            +
              printf("%d %.3lf\n", *out1, *out2);
         | 
| 12 | 
            +
            }
         | 
| 13 | 
            +
            int main() {
         | 
| 14 | 
            +
              ActivateComplexDataType();
         | 
| 15 | 
            +
            }
         | 
| @@ -1,2 +1,2 @@ | |
| 1 | 
            -
            NAME = "ComplexDataType"
         | 
| 2 | 
            -
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| 1 | 
            +
            NAME = "ComplexDataType"
         | 
| 2 | 
            +
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| 
            File without changes
         | 
| @@ -1,5 +1,5 @@ | |
| 1 | 
            -
            1
         | 
| 2 | 
            -
            2
         | 
| 3 | 
            -
            3
         | 
| 4 | 
            -
            4
         | 
| 5 | 
            -
            5
         | 
| 1 | 
            +
            1
         | 
| 2 | 
            +
            2
         | 
| 3 | 
            +
            3
         | 
| 4 | 
            +
            4
         | 
| 5 | 
            +
            5
         | 
| @@ -1,90 +1,90 @@ | |
| 1 | 
            -
            module LCDClock
         | 
| 2 | 
            -
            in
         | 
| 3 | 
            -
              btnMode(False) : Bool,   # Is mode-button pushed now?
         | 
| 4 | 
            -
              btnNext(False) : Bool,   # Is next-button pushed now?
         | 
| 5 | 
            -
              btnRotate(False) : Bool, # Is rotate-button pushed now?
         | 
| 6 | 
            -
              pulse100ms : Bool        # input to be True only once per 100ms
         | 
| 7 | 
            -
            out
         | 
| 8 | 
            -
              hour, min, sec,            # current time to display
         | 
| 9 | 
            -
              maskHour, maskMin, maskSec # Is it now needed to display -- instead of two-digits?
         | 
| 10 | 
            -
            use
         | 
| 11 | 
            -
              Std
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            # Functions
         | 
| 14 | 
            -
            # --------------------
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            type Mode = Normal | Edit
         | 
| 17 | 
            -
            type TPos = HPos | MPos | SPos
         | 
| 18 | 
            -
            type Time = Time(Int, Int, Int)
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            func nextMode(m) = m of Normal -> Edit, Edit -> Normal
         | 
| 21 | 
            -
             | 
| 22 | 
            -
            func editable(m) = m of Normal -> False, Edit -> True
         | 
| 23 | 
            -
             | 
| 24 | 
            -
            func nextPos(p) = p of HPos -> MPos, MPos -> SPos, SPos -> HPos
         | 
| 25 | 
            -
             | 
| 26 | 
            -
            func positiveEdge(a, b) = !a && b
         | 
| 27 | 
            -
             | 
| 28 | 
            -
            # proceed Time by 1sec
         | 
| 29 | 
            -
            func proceedTime(t) = {
         | 
| 30 | 
            -
              Time(h, m, s) = t
         | 
| 31 | 
            -
              newS = s + 1
         | 
| 32 | 
            -
              newM = m + (newS / 60)
         | 
| 33 | 
            -
              newH = h + (newM / 60)
         | 
| 34 | 
            -
              Time(newH % 24, newM % 60, newS % 60)
         | 
| 35 | 
            -
            }
         | 
| 36 | 
            -
             | 
| 37 | 
            -
            func roundingTime(t, dh, dm, ds) = {
         | 
| 38 | 
            -
              Time(h, m, s) = t
         | 
| 39 | 
            -
              Time((h + dh) % 24, (m + dm) % 60, (s + ds) % 60)
         | 
| 40 | 
            -
            }
         | 
| 41 | 
            -
             | 
| 42 | 
            -
            # Nodes
         | 
| 43 | 
            -
            # --------------------
         | 
| 44 | 
            -
             | 
| 45 | 
            -
            # mod-10 counter incremented by every 100ms
         | 
| 46 | 
            -
            node init[0] counter : Int =
         | 
| 47 | 
            -
              (if pulse100ms then counter@last + 1 else counter@last) % 10
         | 
| 48 | 
            -
             | 
| 49 | 
            -
            # time-varying value to be True only once per 1sec
         | 
| 50 | 
            -
            node pulse1s : Bool =
         | 
| 51 | 
            -
              counter == 0 && counter@last != 0
         | 
| 52 | 
            -
             | 
| 53 | 
            -
            # time-varying value switching True/False by every 500ms
         | 
| 54 | 
            -
            node flash : Bool =
         | 
| 55 | 
            -
              counter < 5
         | 
| 56 | 
            -
             | 
| 57 | 
            -
            # time-varying value representing current time-set mode
         | 
| 58 | 
            -
            node init[Normal] curMode : Mode =
         | 
| 59 | 
            -
              if btnMode@last `positiveEdge` btnMode then curMode@last.nextMode else curMode@last
         | 
| 60 | 
            -
             | 
| 61 | 
            -
            # time-varying value representing current editing-cursor-position
         | 
| 62 | 
            -
            node init[HPos] curPos : TPos =
         | 
| 63 | 
            -
              if btnNext@last `positiveEdge` btnNext then curPos@last.nextPos else curPos@last
         | 
| 64 | 
            -
             | 
| 65 | 
            -
            # time-varying value representing diffs to add to current time.
         | 
| 66 | 
            -
            node (dh, dm, ds) : (Int, Int, Int) =
         | 
| 67 | 
            -
              if curMode.editable && (btnRotate@last `positiveEdge` btnRotate) then
         | 
| 68 | 
            -
                curPos of:
         | 
| 69 | 
            -
                  HPos -> (1, 0, 0)
         | 
| 70 | 
            -
                  MPos -> (0, 1, 0)
         | 
| 71 | 
            -
                  SPos -> (0, 0, 1)
         | 
| 72 | 
            -
              else
         | 
| 73 | 
            -
                (0, 0, 0)
         | 
| 74 | 
            -
             | 
| 75 | 
            -
            # time-varying value representing current time
         | 
| 76 | 
            -
            node init[Time(0, 0, 0)] Time(hour, min, sec) as curTime =
         | 
| 77 | 
            -
              if pulse1s then
         | 
| 78 | 
            -
                curTime@last.proceedTime.roundingTime(dh, dm, ds)
         | 
| 79 | 
            -
              else
         | 
| 80 | 
            -
                curTime@last.roundingTime(dh, dm, ds)
         | 
| 81 | 
            -
             | 
| 82 | 
            -
            # time-varying value representing need of masking
         | 
| 83 | 
            -
            node (maskHour, maskMin, maskSec) =
         | 
| 84 | 
            -
              if curMode.editable && flash then
         | 
| 85 | 
            -
                curPos of:
         | 
| 86 | 
            -
                  HPos -> (True, False, False)
         | 
| 87 | 
            -
                  MPos -> (False, True, False)
         | 
| 88 | 
            -
                  SPos -> (False, False, True)
         | 
| 89 | 
            -
              else
         | 
| 90 | 
            -
                (False, False, False)
         | 
| 1 | 
            +
            module LCDClock
         | 
| 2 | 
            +
            in
         | 
| 3 | 
            +
              btnMode(False) : Bool,   # Is mode-button pushed now?
         | 
| 4 | 
            +
              btnNext(False) : Bool,   # Is next-button pushed now?
         | 
| 5 | 
            +
              btnRotate(False) : Bool, # Is rotate-button pushed now?
         | 
| 6 | 
            +
              pulse100ms : Bool        # input to be True only once per 100ms
         | 
| 7 | 
            +
            out
         | 
| 8 | 
            +
              hour, min, sec,            # current time to display
         | 
| 9 | 
            +
              maskHour, maskMin, maskSec # Is it now needed to display -- instead of two-digits?
         | 
| 10 | 
            +
            use
         | 
| 11 | 
            +
              Std
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            # Functions
         | 
| 14 | 
            +
            # --------------------
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            type Mode = Normal | Edit
         | 
| 17 | 
            +
            type TPos = HPos | MPos | SPos
         | 
| 18 | 
            +
            type Time = Time(Int, Int, Int)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            func nextMode(m) = m of Normal -> Edit, Edit -> Normal
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            func editable(m) = m of Normal -> False, Edit -> True
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            func nextPos(p) = p of HPos -> MPos, MPos -> SPos, SPos -> HPos
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            func positiveEdge(a, b) = !a && b
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            # proceed Time by 1sec
         | 
| 29 | 
            +
            func proceedTime(t) = {
         | 
| 30 | 
            +
              Time(h, m, s) = t
         | 
| 31 | 
            +
              newS = s + 1
         | 
| 32 | 
            +
              newM = m + (newS / 60)
         | 
| 33 | 
            +
              newH = h + (newM / 60)
         | 
| 34 | 
            +
              Time(newH % 24, newM % 60, newS % 60)
         | 
| 35 | 
            +
            }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            func roundingTime(t, dh, dm, ds) = {
         | 
| 38 | 
            +
              Time(h, m, s) = t
         | 
| 39 | 
            +
              Time((h + dh) % 24, (m + dm) % 60, (s + ds) % 60)
         | 
| 40 | 
            +
            }
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            # Nodes
         | 
| 43 | 
            +
            # --------------------
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            # mod-10 counter incremented by every 100ms
         | 
| 46 | 
            +
            node init[0] counter : Int =
         | 
| 47 | 
            +
              (if pulse100ms then counter@last + 1 else counter@last) % 10
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            # time-varying value to be True only once per 1sec
         | 
| 50 | 
            +
            node pulse1s : Bool =
         | 
| 51 | 
            +
              counter == 0 && counter@last != 0
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            # time-varying value switching True/False by every 500ms
         | 
| 54 | 
            +
            node flash : Bool =
         | 
| 55 | 
            +
              counter < 5
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            # time-varying value representing current time-set mode
         | 
| 58 | 
            +
            node init[Normal] curMode : Mode =
         | 
| 59 | 
            +
              if btnMode@last `positiveEdge` btnMode then curMode@last.nextMode else curMode@last
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            # time-varying value representing current editing-cursor-position
         | 
| 62 | 
            +
            node init[HPos] curPos : TPos =
         | 
| 63 | 
            +
              if btnNext@last `positiveEdge` btnNext then curPos@last.nextPos else curPos@last
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            # time-varying value representing diffs to add to current time.
         | 
| 66 | 
            +
            node (dh, dm, ds) : (Int, Int, Int) =
         | 
| 67 | 
            +
              if curMode.editable && (btnRotate@last `positiveEdge` btnRotate) then
         | 
| 68 | 
            +
                curPos of:
         | 
| 69 | 
            +
                  HPos -> (1, 0, 0)
         | 
| 70 | 
            +
                  MPos -> (0, 1, 0)
         | 
| 71 | 
            +
                  SPos -> (0, 0, 1)
         | 
| 72 | 
            +
              else
         | 
| 73 | 
            +
                (0, 0, 0)
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            # time-varying value representing current time
         | 
| 76 | 
            +
            node init[Time(0, 0, 0)] Time(hour, min, sec) as curTime =
         | 
| 77 | 
            +
              if pulse1s then
         | 
| 78 | 
            +
                curTime@last.proceedTime.roundingTime(dh, dm, ds)
         | 
| 79 | 
            +
              else
         | 
| 80 | 
            +
                curTime@last.roundingTime(dh, dm, ds)
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            # time-varying value representing need of masking
         | 
| 83 | 
            +
            node (maskHour, maskMin, maskSec) =
         | 
| 84 | 
            +
              if curMode.editable && flash then
         | 
| 85 | 
            +
                curPos of:
         | 
| 86 | 
            +
                  HPos -> (True, False, False)
         | 
| 87 | 
            +
                  MPos -> (False, True, False)
         | 
| 88 | 
            +
                  SPos -> (False, False, True)
         | 
| 89 | 
            +
              else
         | 
| 90 | 
            +
                (False, False, False)
         | 
| 
            File without changes
         | 
| @@ -1,2 +1,2 @@ | |
| 1 | 
            -
            NAME = "LCDClock"
         | 
| 2 | 
            -
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| 1 | 
            +
            NAME = "LCDClock"
         | 
| 2 | 
            +
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| @@ -1,30 +1,30 @@ | |
| 1 | 
            -
            module LCDPositioner
         | 
| 2 | 
            -
            in
         | 
| 3 | 
            -
              up : Bool,
         | 
| 4 | 
            -
              down : Bool,
         | 
| 5 | 
            -
              left : Bool,
         | 
| 6 | 
            -
              right : Bool,
         | 
| 7 | 
            -
              pulse10ms : Bool
         | 
| 8 | 
            -
            out
         | 
| 9 | 
            -
              x, y
         | 
| 10 | 
            -
            use
         | 
| 11 | 
            -
              Std
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            node dy = down.boolToInt - up.boolToInt
         | 
| 14 | 
            -
            node dx = right.boolToInt - left.boolToInt
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            node init[(False, 0)] (pulse40ms, pulse40msCount) as pulse = {
         | 
| 17 | 
            -
              c = (pulse40msCount@last + pulse10ms.boolToInt) % 4
         | 
| 18 | 
            -
              (c == 0 && pulse10ms, c)
         | 
| 19 | 
            -
            }
         | 
| 20 | 
            -
             | 
| 21 | 
            -
            node init[(0,0)] (x, y) as pos =
         | 
| 22 | 
            -
              if pulse40ms then (x@last + dx, y@last + dy) else pos@last
         | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
            #@ :assert-module
         | 
| 26 | 
            -
            #-   True, False, False, False, True => 0, 0
         | 
| 27 | 
            -
            #@ : True, False, False, False, True => 0, 0
         | 
| 28 | 
            -
            #@ : True, False, False, False, True => 0, 0
         | 
| 29 | 
            -
            #@ : True, False, False, False, True => 0, -1
         | 
| 30 | 
            -
            #@ : True, False, False, False, True => 0, -1
         | 
| 1 | 
            +
            module LCDPositioner
         | 
| 2 | 
            +
            in
         | 
| 3 | 
            +
              up : Bool,
         | 
| 4 | 
            +
              down : Bool,
         | 
| 5 | 
            +
              left : Bool,
         | 
| 6 | 
            +
              right : Bool,
         | 
| 7 | 
            +
              pulse10ms : Bool
         | 
| 8 | 
            +
            out
         | 
| 9 | 
            +
              x, y
         | 
| 10 | 
            +
            use
         | 
| 11 | 
            +
              Std
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            node dy = down.boolToInt - up.boolToInt
         | 
| 14 | 
            +
            node dx = right.boolToInt - left.boolToInt
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            node init[(False, 0)] (pulse40ms, pulse40msCount) as pulse = {
         | 
| 17 | 
            +
              c = (pulse40msCount@last + pulse10ms.boolToInt) % 4
         | 
| 18 | 
            +
              (c == 0 && pulse10ms, c)
         | 
| 19 | 
            +
            }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            node init[(0,0)] (x, y) as pos =
         | 
| 22 | 
            +
              if pulse40ms then (x@last + dx, y@last + dy) else pos@last
         | 
| 23 | 
            +
             | 
| 24 | 
            +
             | 
| 25 | 
            +
            #@ :assert-module
         | 
| 26 | 
            +
            #-   True, False, False, False, True => 0, 0
         | 
| 27 | 
            +
            #@ : True, False, False, False, True => 0, 0
         | 
| 28 | 
            +
            #@ : True, False, False, False, True => 0, 0
         | 
| 29 | 
            +
            #@ : True, False, False, False, True => 0, -1
         | 
| 30 | 
            +
            #@ : True, False, False, False, True => 0, -1
         | 
| @@ -1,15 +1,15 @@ | |
| 1 | 
            -
            #include "LCDPositioner.h"
         | 
| 2 | 
            -
            #include <stdio.h>
         | 
| 3 | 
            -
            #include <stdlib.h>
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            void Input(int* up, int* down, int* left, int* right, int* pulse10ms) {
         | 
| 6 | 
            -
              if (scanf("%d %d %d %d %d", up, down, left, right, pulse10ms) == EOF) {
         | 
| 7 | 
            -
                exit(0);
         | 
| 8 | 
            -
              }
         | 
| 9 | 
            -
            }
         | 
| 10 | 
            -
            void Output(int* x, int* y) {
         | 
| 11 | 
            -
              printf("%d %d\n", *x, *y);
         | 
| 12 | 
            -
            }
         | 
| 13 | 
            -
            int main() {
         | 
| 14 | 
            -
              ActivateLCDPositioner();
         | 
| 15 | 
            -
            }
         | 
| 1 | 
            +
            #include "LCDPositioner.h"
         | 
| 2 | 
            +
            #include <stdio.h>
         | 
| 3 | 
            +
            #include <stdlib.h>
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            void Input(int* up, int* down, int* left, int* right, int* pulse10ms) {
         | 
| 6 | 
            +
              if (scanf("%d %d %d %d %d", up, down, left, right, pulse10ms) == EOF) {
         | 
| 7 | 
            +
                exit(0);
         | 
| 8 | 
            +
              }
         | 
| 9 | 
            +
            }
         | 
| 10 | 
            +
            void Output(int* x, int* y) {
         | 
| 11 | 
            +
              printf("%d %d\n", *x, *y);
         | 
| 12 | 
            +
            }
         | 
| 13 | 
            +
            int main() {
         | 
| 14 | 
            +
              ActivateLCDPositioner();
         | 
| 15 | 
            +
            }
         | 
| @@ -1,2 +1,2 @@ | |
| 1 | 
            -
            NAME = "LCDPositioner"
         | 
| 2 | 
            -
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| 1 | 
            +
            NAME = "LCDPositioner"
         | 
| 2 | 
            +
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
    
        data/tests/compiler/Rakefile
    CHANGED
    
    | @@ -1,8 +1,8 @@ | |
| 1 | 
            -
            task :default do
         | 
| 2 | 
            -
              Dir.glob("[a-zA-Z0-9_]*") do |d|
         | 
| 3 | 
            -
                Dir.chdir(d) do
         | 
| 4 | 
            -
                  puts "moved into directory `#{d}'"
         | 
| 5 | 
            -
                  sh "rake"
         | 
| 6 | 
            -
                end if Dir.exist?(d)
         | 
| 7 | 
            -
              end
         | 
| 8 | 
            -
            end
         | 
| 1 | 
            +
            task :default do
         | 
| 2 | 
            +
              Dir.glob("[a-zA-Z0-9_]*") do |d|
         | 
| 3 | 
            +
                Dir.chdir(d) do
         | 
| 4 | 
            +
                  puts "moved into directory `#{d}'"
         | 
| 5 | 
            +
                  sh "rake"
         | 
| 6 | 
            +
                end if Dir.exist?(d)
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
            end
         | 
| @@ -1,23 +1,23 @@ | |
| 1 | 
            -
            $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
         | 
| 2 | 
            -
            require 'emfrp'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            task :default do
         | 
| 5 | 
            -
              begin
         | 
| 6 | 
            -
                puts "TESTING #{NAME}".colorize(:light_blue)
         | 
| 7 | 
            -
                sh "../../../bin/emfrp #{NAME}.mfrp"
         | 
| 8 | 
            -
                sh "cc -c #{NAME}.c"
         | 
| 9 | 
            -
                sh "cc -c #{NAME}Main.c"
         | 
| 10 | 
            -
                sh "cc #{NAME}.o #{NAME}Main.o -o #{NAME}"
         | 
| 11 | 
            -
                sh "./#{NAME} < in.txt > actual_out.txt"
         | 
| 12 | 
            -
                sh "rm #{NAME}Main.c.gen"
         | 
| 13 | 
            -
                sh "rm #{NAME}.c"
         | 
| 14 | 
            -
                sh "rm #{NAME}.h"
         | 
| 15 | 
            -
                sh "rm #{NAME}.o"
         | 
| 16 | 
            -
                sh "rm #{NAME}Main.o"
         | 
| 17 | 
            -
                sh "rm #{NAME}"
         | 
| 18 | 
            -
                sh "diff expected_out.txt actual_out.txt -u"
         | 
| 19 | 
            -
                puts "  => ok".colorize(:green)
         | 
| 20 | 
            -
              rescue
         | 
| 21 | 
            -
                puts "  => fail".colorize(:red)
         | 
| 22 | 
            -
              end
         | 
| 23 | 
            -
            end
         | 
| 1 | 
            +
            $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
         | 
| 2 | 
            +
            require 'emfrp'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            task :default do
         | 
| 5 | 
            +
              begin
         | 
| 6 | 
            +
                puts "TESTING #{NAME}".colorize(:light_blue)
         | 
| 7 | 
            +
                sh "../../../bin/emfrp #{NAME}.mfrp"
         | 
| 8 | 
            +
                sh "cc -c #{NAME}.c"
         | 
| 9 | 
            +
                sh "cc -c #{NAME}Main.c"
         | 
| 10 | 
            +
                sh "cc #{NAME}.o #{NAME}Main.o -o #{NAME}"
         | 
| 11 | 
            +
                sh "./#{NAME} < in.txt > actual_out.txt"
         | 
| 12 | 
            +
                sh "rm #{NAME}Main.c.gen"
         | 
| 13 | 
            +
                sh "rm #{NAME}.c"
         | 
| 14 | 
            +
                sh "rm #{NAME}.h"
         | 
| 15 | 
            +
                sh "rm #{NAME}.o"
         | 
| 16 | 
            +
                sh "rm #{NAME}Main.o"
         | 
| 17 | 
            +
                sh "rm #{NAME}"
         | 
| 18 | 
            +
                sh "diff expected_out.txt actual_out.txt -u"
         | 
| 19 | 
            +
                puts "  => ok".colorize(:green)
         | 
| 20 | 
            +
              rescue
         | 
| 21 | 
            +
                puts "  => fail".colorize(:red)
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -1,2 +1,2 @@ | |
| 1 | 
            -
            NAME = "UseData"
         | 
| 2 | 
            -
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| 1 | 
            +
            NAME = "UseData"
         | 
| 2 | 
            +
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| @@ -1,8 +1,8 @@ | |
| 1 | 
            -
            module UseData out x use Std
         | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
            data one = 1         # one 
         | 
| 5 | 
            -
            data two = one + 1   # two
         | 
| 6 | 
            -
            data three = two + 1 # three
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            node x = three
         | 
| 1 | 
            +
            module UseData out x use Std
         | 
| 2 | 
            +
             | 
| 3 | 
            +
             | 
| 4 | 
            +
            data one = 1         # one 
         | 
| 5 | 
            +
            data two = one + 1   # two
         | 
| 6 | 
            +
            data three = two + 1 # three
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            node x = three
         | 
| @@ -1,2 +1,2 @@ | |
| 1 | 
            -
            NAME = "UseSubModule"
         | 
| 2 | 
            -
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| 1 | 
            +
            NAME = "UseSubModule"
         | 
| 2 | 
            +
            load File.expand_path('../../Rakefile.common', __FILE__)
         | 
| @@ -1,8 +1,8 @@ | |
| 1 | 
            -
            module SubModule
         | 
| 2 | 
            -
            in i1 : Int, i2 : Int
         | 
| 3 | 
            -
            out x, y
         | 
| 4 | 
            -
            use Std
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            newnode a = SubModule2(i1)
         | 
| 7 | 
            -
            node x = a * i2
         | 
| 8 | 
            -
            node init[0] y = y@last + i2
         | 
| 1 | 
            +
            module SubModule
         | 
| 2 | 
            +
            in i1 : Int, i2 : Int
         | 
| 3 | 
            +
            out x, y
         | 
| 4 | 
            +
            use Std
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            newnode a = SubModule2(i1)
         | 
| 7 | 
            +
            node x = a * i2
         | 
| 8 | 
            +
            node init[0] y = y@last + i2
         | 
| @@ -1,5 +1,5 @@ | |
| 1 | 
            -
            module SubModule2
         | 
| 2 | 
            -
            in x : Int
         | 
| 3 | 
            -
            out y
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            node y = x
         | 
| 1 | 
            +
            module SubModule2
         | 
| 2 | 
            +
            in x : Int
         | 
| 3 | 
            +
            out y
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            node y = x
         | 
| @@ -1,11 +1,11 @@ | |
| 1 | 
            -
            module UseSubModule
         | 
| 2 | 
            -
            in x : Int
         | 
| 3 | 
            -
            out a1, b1, a2, b2
         | 
| 4 | 
            -
            use Std
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            newnode a1, b1 = SubModule(x, 2)
         | 
| 7 | 
            -
            newnode a2, b2 = SubModule(x + 1, 3)
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            #@ :assert-module
         | 
| 10 | 
            -
            #-   0 => 0, 2, 3, 3
         | 
| 11 | 
            -
            #@ : 1 => 2, 4, 6, 6
         | 
| 1 | 
            +
            module UseSubModule
         | 
| 2 | 
            +
            in x : Int
         | 
| 3 | 
            +
            out a1, b1, a2, b2
         | 
| 4 | 
            +
            use Std
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            newnode a1, b1 = SubModule(x, 2)
         | 
| 7 | 
            +
            newnode a2, b2 = SubModule(x + 1, 3)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            #@ :assert-module
         | 
| 10 | 
            +
            #-   0 => 0, 2, 3, 3
         | 
| 11 | 
            +
            #@ : 1 => 2, 4, 6, 6
         |