我需要一个函数来识别 token 的结尾,以便我可以在其中保存一个数组并将其发送到我的自动机进行识别(运算符、关键字、标识符)
当我只输入 1 个 token 时,自动机工作得很好,但是当有“很多 token (包括空格)时,它不起作用,我需要这个函数来删除空格并在每个 token 末尾停止并发送每个 token ”在我的自动机函数的数组中,我被卡住了..
我正在使用C
例如:ABC + D
: ABC 代币 1
: + token 2
:D代币3
ex2: ABC++D12*/z (ABC,+,+,D12,*,/,z) 7 个标记 ex3: AD++ - C (AD,+,+,-,C) 5 个标记
编辑:我没有使用任何工具,仅使用带有确定性有限自动机的c
最佳答案
假设注释在之前的传递中被删除。
现在您可以输入空格、字母、数字或标点符号。
空格要么不是标记,要么是解析器忽略的虚拟/空标记。
字母必须是标识符的一部分。它由一个字母(或下划线,小曲线球)后跟零个或多个字母或数字组成。空格或下划线以外的标点符号终止该标记。
数字必须是数字的一部分。规则有点复杂,前面的 0 表示八进制(已过时),前面的 0x 表示十六进制,1-9 表示十进制。允许使用后缀和科学记数法。但任意[标点符号或空格终止数字。
对于一元 -、++、<=、+= 和其他复合词,没有什么复杂的规则。但这些代币没有附加值。++ 始终是++。
字符串是下一个大问题,因为引号可以转义。
但仅此而已。为 C 源代码手动构建词法分析器并不难。
(请参阅 MiniBasic 了解如何为简单语言编写简单但功能齐全的递归下降解析器。 https://sourceforge.net/projects/minibasic/files/?source=navbar )
关于c - 词法分析器: how to identify the end of a token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41389263/