使用C#将类似于C语言或Lisp语言的代码解析成数组的好方法是什么?

3

如何使用C#将类似C或Lisp的代码解析成数组?

例如,对于以下小片段:

if (number > 50) {
    alert('Hello, World!');
}

我希望能够将每个单词和符号存储到一个数组中。
但是到目前为止,我只能输出以下类似的数组:
[0] if
[1] (number
[2] >
[3] 50)
[4] {
[5] alert('Hello,
[6] World!');
[7] }

你看到数组位置1,它显示的是(number?那不是我想要的。我想把这个小括号放到它自己的数组位置里。

我最初想做的是读取代码的每个字符,然后根据需要将它们存储到数组中。但是,当解析字符串时,这似乎就像是在重复造轮子。有没有更简单的方法来做到这一点?

p.s. 我这样做是因为我想学习正确的字符串操作。


7
这被称为分词,是构建编译器的第一步。我建议您研究编译器分词,可能有数十个适用于类C语言的分词示例。 - Chris Eberle
1
这个问题已经被问了很多次了,大多数人最终都会参考https://dev59.com/x3VD5IYBdhLWcg3wXaed。此外,数组不是语法的好表示方式,如果您决定将代码存储在数组中,字符串也不是标记的好表示方式。首先确定您想要学习如何解析代码还是操作字符串,这两个问题是不同的。 - Dour High Arch
3个回答

3

解析C语言有许多规则,不能仅使用空格字符对代码进行标记化。

您需要有符号的概念。标记. , - + / * -> ( ) = == != < > <= >= << >> ; ? : " ' & && | || ~(等等)都是符号。如果在解析过程中遇到其中之一,则将其视为单独的标记,而不管下一个字符是什么。在“和'之后,请忽略此规则,直到再次遇到“/”或“'”,除非它在转义字符\之后。还有注释处理、三字符组处理、宏处理等需要注意的事项。


转义字符是反斜杠('\\'),而不是正斜杠('/')。 - Ben Voigt

1

阅读关于fslex和fsyacc的内容。这可能是学习抽象语法树、词法分析器和解析器的良好起点。

此外,使用fslex和fsyacc编写的F#词法分析器和解析器在.NET应用程序中易于使用。


我一直在寻找一个简单但不平凡的 F# 解析器示例 - 我和发帖者有类似的想法,都希望通过解析来入门。 - Aaron Anodide
1
或者是Antlr,它也可以创建用C#编写的解析器。 - Ben Voigt
@Gabriel,Don Syme的《Expert F#》有一个简单但实用的例子。不幸的是,我在网上看到的例子并没有涵盖所有内容:例如,我没有看到使用%right / %left / %noassoc或多个词法分析器规则来解析注释的示例。因此,我强烈推荐阅读Don Syme的书。 - Dmitry

0
你可以尝试设置一个解析器,首先检查文本是否属于某种“内容”,然后相应地进行标记化处理。
如需了解这方面的书籍,请查看《计算机程序的构造和解释》(也称为SICP)在线提供,该书在世界许多大学中使用。您可以找到他们用作起点的eval函数示例

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接