例如,如果输入为x+=5
,则程序应返回x
,+=
,5
的数组。请注意,在x
和+=
之间没有空格,因此按空格分隔可能仅行不通,因为那样的话,您将不得不重新遍历它以找到关键字。
我该怎么做?
在C中有有效的方法吗?
最佳答案
Lexing不是特定于C的(在某种意义上,您将在其他编程语言中使用类似的技术)。您可以使用手写代码(使用finite automaton编码技术)做到这一点。您可以使用诸如flex之类的词法生成器。您甚至可以使用regexprs,例如regex.h在POSIX系统上起作用。
Parsing也是具有标准技术的众所周知的领域(如果要提高效率,至少对于context free languages而言)。您可以使用recursive descent parsing,也可以使用bison(非常接近家庭作业的examples)或ANTLR生成解析器。阅读有关LL parsing和LR parsing的更多信息。顺便说一句,解析技术可用于词法分析。
顺便说一句,有大量的free software(例如,诸如Guile,Lua,Python等脚本语言的解释器),JSON,YAML,XML ...解析器,编译器(例如tinycc)等...说明了这些技术。通过研究他们的源代码,您将学到很多东西。
您有时可能会提前一个或两个字符来进行预读,例如首先读取整行(使用getline(3)或fgets(3),甚至使用readline,这将为您提供行编辑器)。如果您无法阅读整行,请考虑在需要时使用fgetc(3)和ungetc
。来自<ctype.h>
的分类实用程序(例如isalpha)可能会有所帮助。
如果您关心UTF-8(原则上应该这样做),则事情会变得稍微复杂一些,因为某些Unicode字符(例如€,é,𝛃,...)在UTF-8中用几个字节表示。像libunistring这样的库应该会很有帮助。