如何在现有语言中指定不同语言结构的抽象语法?

问题描述 投票:0回答:1

我试图解决在 Haskell 中指定不同语言结构的抽象语法的问题,例如变量声明、数组声明、if-else 语句等,但我对这意味着什么感到困惑。这只是 Haskell 中的样子吗?以下是我负责的语言构造之一:

  • 变量声明
    • 无类型
    • 变量声明还可以选择指定初始值(具体语法示例:
      var x = 10;
      • 初始值只能是整数/布尔值/字符串

我尝试解决上述问题并写下: var = int | 变量布尔 |字符串

当我负责以下语言结构时,我会感到相当困惑:

  • 算术表达式
    • 原始表达:
      • 有些被认为是理所当然的(即不需要指定):整数文字、布尔文字、字符串文字
      • 使用变量
      • 访问班级成员
      • 索引数组元素
      • 函数调用
      • (可能需要其他原始表达式) 因为我不确定我该如何开始。

我本质上只是问我是否正确理解这一点,因为我似乎在其他地方找不到任何例子,以及我是否可以获得任何提示来更好地帮助我理解。我也不确定这个网站是否是问这个问题的正确地方,因为它看起来比平时更加理论化,所以如果这是错误的地方,请指出另一个可能更合适的论坛。预先感谢您的帮助。

haskell syntax abstract
1个回答
0
投票

我相信他们要求你做的是定义适合表示某些“目标语言”的抽象语法的 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 上还有一个示例

© www.soinside.com 2019 - 2024. All rights reserved.