0

我想写一个haskell程序来实现一种基于其指称语义的简单命令式语言。我在 Windows 上使用 GHCi,版本 8.4.2。我在实现下面描述的函数和过程抽象时遇到了一些问题。

让我描述一下。我称之为 IMP。首先,我定义了抽象语法。IMP 只接受整数。和标识符将是字符串。

    type      Numeral  = Int      
    type      Ident    = String

    data Command =
                  Skip
                | Assign   (Ident,       Expression)
                | Letin    (Declaration, Command   )
                | Cmdcmd   (Command,     Command   )
                | Ifthen   (Expression,  Command, Command)
                | Whiledo  (Expression,  Command   )
                | IdentifierC ( ActualParameter )

    data Expression =
                Num    Numeral
                | False_
                | True_
                | Notexp   Expression
                | Id       Ident
                | Sumof   (Expression,  Expression)
                | Subof   (Expression,  Expression)
                | Prodof  (Expression,  Expression)
                | Less    (Expression,  Expression)
                | Leten   (Declaration, Expression)
                | IdentifierE ( ActualParameter )
                  deriving Show

    type ActualParameter = Expression

    data FormalParameter = Constfp Identifier

    data Declaration =
              Constdef (Ident,  Expression)
            | Vardef   (Ident,  TypeDef   )
            | Func Identifier ( FormalParameter ) ~ Expression
            | Proce Identifier ( FormalParameter ) ~ Command
              deriving Show

    data TypeDef =
              Bool | Int
              deriving Show

简要说明:在 Command 中,Skip 什么都不做。分配会将表达式的值赋予标识。Letin 将在命令中声明一些变量。Cmdcmd 将依次运行 2 个命令。ifthen 是条件命令,如果第一个表达式被评估为真,则运行第一个命令,否则运行第二个命令。Whiledo 是循环。IdentifierC ( ActualParameter ):IdentifierC 表示本地环境中的某些功能。这个 ActualParameter 是一些带有一些值的表达式。这个命令只是在指定的值上调用这个函数。

在Expression中,从上到下依次是: numeric bool false bool true negate of expression 从本地环境中获取Ident的值。sum 2 个表达式减去 2 个表达式的乘积 2 < 在表达式中声明某个变量 IdentifierE ( ActualParameter ) IdentifierE 表示本地环境中的某个函数。这个 ActualParameter 是一些带有一些值的表达式。这个命令只是在指定的值上调用这个函数。最后得到一个新值作为这个表达式的结果。

然后是语义域

    type    Integer = Int
    type    Boolean = Bool
    type    Location  = Int
    type    Function = Argument -> Store -> Value
    type    Procedure = Argument -> Store -> Store
    -- store would be snapshot of the memory.

    data    Value   = IntValue    Int
                    | TruthValue  Bool
                      deriving (Eq, Show)
    -- first class value only are int and bool

    type    Storable  = Value

    data    Bindable  = Const Value 
                      | Variable Location 
                      | Function Func 
                      | Procedure Proce
                      deriving (Eq, Show)

    data    Denotable = Unbound | Bound Bindable
                      deriving (Eq, Show)

    type    Argument = Value

    data Sval  = Stored Storable | Undef | Unused

    -- The actual storage in a Store
    type DataStore = Location -> Sval

    --                   --bot---   --top---  --data---
    data Store = Store (Location,  Location,  DataStore)

    type  Environ  =  Ident -> Denotable

    -- ---------- Semantic Functions -------------- --
    valuation :: Int         -> Value
    evaluate  :: Expression  -> Environ -> Store ->  Value
    elaborate :: Declaration -> Environ -> Store ->  (Environ,Store)
    execute   :: Command     -> Environ -> Store ->  Store

    -- the main goal is to define these semantic functions
    -- I give some examples in my source code below.

我的代码在这里:https ://github.com/sanyuwen/IMP/blob/master/DSemImp.hs 。我的测试代码在这里:https ://github.com/sanyuwen/IMP/blob/master/ImpTest.hs

当我使用 GHC 导入 DSemImp 模块时,我遇到了很多错误。

DSemImp.hs:52:32: error:
    Not in scope: type constructor or class ‘Identifier’
   |
52 | data FormalParameter = Constfp Identifier    |                                ^^^^^^^^^^
It said data FormalParameter = Constfp Identifier is not legal.
without this how can I define formal parameter ??
4

1 回答 1

3

你没有定义Identifier。尽管您定义Ident了 ,但这就是您的意思吗?

于 2019-01-31T04:26:45.543 回答