对于我的项目,我想在JavaScript中实现一个模仿GNU C预处理器的自定义预处理器(即gcc -E
)。
我编写的这个预处理器已经有大部分工作,除了条件。因此,#ifdef
,#ifndef
,#else
和#endif
是我所坚持的。
到目前为止我的代码:preprocessor.js(永久链接)
我很高兴听到有关如何实施它的建议! :)
答案 0 :(得分:3)
保持一堆条件并在任何条件为假的情况下继续跳过线。在伪代码中:
for each line
if line == "#if <cond>"
conditions.push(<cond>)
else if line == "#else"
conditions.push(!conditions.pop())
else if line == "#endif"
conditions.pop()
else if all conditions are true
everything fine, handle line
else
skip line
答案 1 :(得分:1)
更好的方法是解析AST,它将包含明确定义的基本块和控制流图。
例如&#34; if&#34; (条件)构造可以表示为
conditional
|
-- test
-- consequent base block
-- [alternate bb]
-- [elseif 1]
|
-- test
-- consequent
...
这种方法更加灵活,允许使用函数,循环,上下文等创建全尺寸语言。
在 Builder 预处理器中可以看到很好的示例:https://github.com/electricimp/Builder