【问题标题】:Create data with Curly Braces in Haskell在 Haskell 中使用花括号创建数据
【发布时间】:2023-08-05 01:20:01
【问题描述】:

我正在尝试创建一个 AST 并漂亮地打印它。我正在解析 C 语言的一部分。但是,当我必须表示一个空语句时,即

{}

我完全被卡住了,因为我无法简单地创建一个包含类似内容的新数据。或者是以下情况

{{}}

相当于

SScope({})

从技术上讲,我的问题是,我如何能够在 Haskell 中漂亮地打印花括号?所以当我收到

{}

我想漂亮地打印一模一样的,比如

{}

那个。我会做的是这样的:

data Stmt = {}

与其他数据元素一样,但我无法做到这一点。对此有何建议?

【问题讨论】:

  • 语法中的语句定义应该包括简单语句和复合语句。复合语句是由{} 包围的零个或多个语句。所以{} 只是一个没有子节点的 CompoundStatement 节点。
  • 你能给我一个复合语句的例子吗?因为在实践中,我不确定这到底是什么意思。
  • 字面意思是{...},里面有零个或多个语句。例如,条件语句是if(<boolean expression>) <statement><statement> 可以替换为像 ; 这样的空语句、像 x = 3; 这样的简单语句或复合语句,通过使用 { 开始它并使用 } 结束它来定义(不终止;)。大括号内是个或多个语句,所以你可以写if(1) {}if(1) {x = 3;}if(1) {x = 3; y = 4;}等。
  • {{}} 是一个复合语句,它只包含一个语句,另一个复合语句(恰好是空的)。
  • 啊,好的,谢谢,现在我明白了。另外,我必须编辑我的问题,因为我认为我做错了

标签: haskell compiler-construction abstract-syntax-tree pretty-print curly-braces


【解决方案1】:

您需要区分语言的词法组件(花括号等)和用于表示句法结构的 Haskell 数据类型。

Haskell 方面应该有类似的东西

data Stmt = 
    CompoundStmnt [Stmt]
    | ValueStmt Identifier Expression
    |  -- And so on for all the other types of statement you want.

然后你定义一个可以识别大括号的解析器,以及一个打印大括号包围的值的漂亮打印机。

【讨论】:

  • 非常感谢!我在声明新数据时从未想过使用列表。