1

基本上,该语言有 3 种列表和 3 种固定长度类型,其中之一是字符串。使用正则表达式检测标记的类型很简单,但是将它们拆分为标记并不是那么简单。

字符串用双引号表示,双引号用反斜杠转义。

编辑:

一些示例代码

{
     print (sum (1 2 3 4))
     if [( 2 + 3 ) < 6] : {print ("Smaller")}
}

像这样的列表

  • () 是仅在必要时评估的参数列表。
  • [] 是用更漂亮的方式表达 2 个操作数操作的特殊列表。
  • {} 是始终被评估的列表。第一个元素是函数名,第二个是参数列表,如此重复。
  • 任何东西 : 任何东西 [ : 任何东西 [: ...]] 转换为参数列表,其中包含由 :s 连接的元素。这只是为了使循环和条件看起来更好。

所有函数都接受一个参数。参数列表可用于需要更多功能的函数。您可以使用不同类型的 eval 函数来评估前和参数列表。(每个列表模型都有 eval 函数)

所以,如果你理解这一点,它的工作原理和 Lisp 非常相似,只是有不同的列表类型来美化代码。

编辑:@rici

[[2 + 3] < 6]也可以。正如我所提到的,仅在必要时才评估参数列表。由于<is 是一个需要长度为 2 的参数列表的函数,(2 + 3)因此必须以某种方式对其进行评估,它[(2 + 3) < 6]会以其他方式转换为< (2 + 3) : 6which equals to < (2 + 3 6)which is 和无效的参数列表<。但是我明白你的意思,在这种情况下自动解析应该如何工作并不是一件容易的事。我上面描述的版本是[...]使用类似的函数评估参数列表eval_as_oplist (...)但我想你是对的,因为这样,你不能在 a 中以常规方式使用参数列表,[...]即使你不这样做也是有问题的没有理由这样做,因为它不会导致更好的代码。[[. . .] . .]我同意,更好的代码也是如此。

4

3 回答 3

0

我建议使用具有 C++ 输出目标的 Flex(可能与 Bison)或 ANTLR。

由于 google 比在我自己的文件服务器上查找内容更简单,这里是其他人的示例:

http://ragnermagalhaes.blogspot.com/2007/08/bison-lisp-grammar.html

此示例存在格式问题(可以通过在文本编辑器中查看 HTML 来解决)并且仅支持一种类型的列表,但它应该可以帮助您入门,并且肯定会显示如何将项目拆分为标记。

于 2012-12-02T23:20:43.137 回答
0

与其发明自己的“类似 Lisp,但更简单”的语言,不如考虑使用现有的 Lisp(或 Scheme)实现并将其嵌入到 C++ 应用程序中。

虽然设计自己的语言,然后为它编写自己的解析器和解释器肯定很有趣,但你将很难想出比 Scheme 和它的众多实现更好的设计、更强大和更有效、更健壮的实现.

Chibi Scheme:http ://code.google.com/p/chibi-scheme/特别适合嵌入 C/C++ 代码,它非常小而且速度很快。

于 2012-12-03T17:31:17.557 回答
0

我相信Boost.Spirit将适合此任务,前提是您可以为您提出的语言构建与 PEG 兼容的语法。从这些例子中看不出是否是这种情况。

更具体地说,Spirit 有一个称为utree的通用 AST ,并且有将符号表达式(即 lisp 语法)解析为 utree 的示例代码。

您不必使用 utree 来利用 Spirit 的解析和词法分析功能,但您必须拥有自己的 AST 表示。也许这就是你想要的?

于 2013-05-06T14:42:42.833 回答