Make 'language term' just a custom mode
Signed-off-by: Danila Fedorin <danila.fedorin@gmail.com>
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
module Bergamot.ObjectLanguage exposing (..)
|
||||
port module Bergamot.ObjectLanguage exposing (..)
|
||||
|
||||
import Bergamot.Syntax as Syntax exposing (Metavariable)
|
||||
import Bergamot.Syntax as Syntax exposing (toString)
|
||||
import Bergamot.Parser exposing (strLit)
|
||||
|
||||
import Parser exposing (Parser, Trailing(..), (|.), (|=))
|
||||
import Platform exposing (worker)
|
||||
import Parser exposing (Parser, Trailing(..), (|.), (|=), run)
|
||||
import Set
|
||||
|
||||
type Type
|
||||
@@ -135,7 +136,7 @@ exprBasic = Parser.lazy <| \() -> Parser.oneOf
|
||||
, parenthed expr
|
||||
]
|
||||
|
||||
typeToTerm : Type -> Syntax.Term Metavariable
|
||||
typeToTerm : Type -> Syntax.Term ()
|
||||
typeToTerm t =
|
||||
case t of
|
||||
TInt -> Syntax.Call "number" []
|
||||
@@ -143,7 +144,7 @@ typeToTerm t =
|
||||
TPair t1 t2 -> Syntax.Call "tpair" [ typeToTerm t1, typeToTerm t2 ]
|
||||
TArr t1 t2 -> Syntax.Call "tarr" [ typeToTerm t1, typeToTerm t2 ]
|
||||
|
||||
exprToTerm : Expr -> Syntax.Term Metavariable
|
||||
exprToTerm : Expr -> Syntax.Term ()
|
||||
exprToTerm e =
|
||||
case e of
|
||||
IntLit i -> Syntax.Call "lit" [Syntax.IntLit i]
|
||||
@@ -156,3 +157,36 @@ exprToTerm e =
|
||||
Abs s t ep -> Syntax.Call "abs" [Syntax.Call s [], typeToTerm t, exprToTerm ep]
|
||||
App e1 e2 -> Syntax.Call "app" [exprToTerm e1, exprToTerm e2]
|
||||
Ref x -> Syntax.Call "var" [Syntax.Call x []]
|
||||
|
||||
-- Receives requests from JS code to apply the parser
|
||||
port parseString : (String -> msg) -> Sub msg
|
||||
|
||||
-- Used to send the result of parsing back to JS
|
||||
port parsedString : { string : String, term : Maybe String } -> Cmd msg
|
||||
|
||||
type Msg = ParseString String
|
||||
type alias Model = ()
|
||||
type alias Flags = ()
|
||||
|
||||
init : Flags -> (Model, Cmd Msg)
|
||||
init _ = ((), Cmd.none)
|
||||
|
||||
update : Msg -> Model -> (Model, Cmd Msg)
|
||||
update (ParseString s) _ =
|
||||
case run topLevelExpr s of
|
||||
Ok e ->
|
||||
( ()
|
||||
, parsedString
|
||||
{ string = s
|
||||
, term =
|
||||
exprToTerm e
|
||||
|> toString (\_ -> "")
|
||||
|> Just
|
||||
}
|
||||
)
|
||||
Err _ -> ((), parsedString { string = s, term = Nothing })
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions _ = parseString ParseString
|
||||
|
||||
main = worker { init = init, update = update, subscriptions = subscriptions }
|
||||
|
||||
Reference in New Issue
Block a user