我试图解决在 Haskell 中指定不同语言结构的抽象语法的问题,例如变量声明、数组声明、if-else 语句等,但我对这意味着什么感到困惑。这只是 Haskell 中的样子吗?以下是我负责的语言构造之一:
var x = 10;
)
我尝试解决上述问题并写下: var = int | 变量布尔 |字符串
当我负责以下语言结构时,我会感到相当困惑:
我本质上只是问我是否正确理解这一点,因为我似乎在其他地方找不到任何例子,以及我是否可以获得任何提示来更好地帮助我理解。我也不确定这个网站是否是问这个问题的正确地方,因为它看起来比平时更加理论化,所以如果这是错误的地方,请指出另一个可能更合适的论坛。预先感谢您的帮助。
我相信他们要求你做的是定义适合表示某些“目标语言”的抽象语法的 Haskell 数据类型。这可能是(在 Haskell 中)实现目标语言的解释器或编译器的第一步。
所以,他们不希望你写下:
var = int | bool | String
因为那不是有效的 Haskell 代码。
相反,您可能需要写下类似以下内容:
-- Haskell data types for statements
type Name = String
data Stmt = Decl Name (Maybe Lit)
data Lit = IntLit Int | BoolLit Bool | StringLit String
这些是有效的 Haskell 数据类型声明,定义了适合表示用目标语言编写的变量声明语句的数据类型。例如,目标语言的声明如下:
// target language code var x; // untyped declaration var number = 42; // initialization with literal
可以使用上述数据类型表示为 Haskell 值,如下所示:
-- Haskell values representing target language statements
stmt1 :: Stmt
stmt1 = Decl "x" Nothing
stmt2 :: Stmt
stmt2 = Decl "number" (Just (IntLit 42))
同样,如果您为如下表达式定义了类型:
-- Haskell data type for expressions
data Expr
= LitE Lit
| VarE String
| MemberE Expr String
| ElementE Expr Expr
| CallE String [Expr]
这将允许您表示目标语言表达式,例如:
// example of a target language expressions add(x.pos[42],1)
作为
Expr
类型的 Haskell 值:
-- Haskell value representing a target language expression
expr1 :: Expr
expr1 = CallE "add" [ElementE (MemberE (VarE "x") "pos") (LitE (IntLit 42)), LitE (IntLit 1)]
如果这个 Haskell 代码对你来说没有任何意义,那么你可能还没有准备好解决这个问题,需要寻找一些 Haskell 教程。看看 这个旧答案 和 wiki 上的 学习 Haskell 页面。
如果这个 Haskell 代码对你有意义,但你无法想象我是如何从你的书面规范中得到这些数据类型的,那么这是可以理解的。最好的办法是回顾一些例子。这是一个 git 存储库,其中包含一些用 Haskell 实现的简单语言,每个子目录一种语言。您将在子目录中的
README.md
中找到每种语言描述的具体语法,以及每种语言的 Parser.hs
模块顶部定义的关联抽象语法数据类型。 Wiki 上还有一个示例。