在预处理器中实现 if-condition

Implementing if-condition in preprocessor

对于我的一个项目,我想在 JavaScript 中实现一个模仿 GNU C 预处理器(即 gcc -E)的自定义预处理器。

我编写的这个预处理器已经可以运行大部分功能,但条件除外。所以,#ifdef#ifndef#else#endif 就是我所坚持的。

到目前为止我的代码:preprocessor.js(永久 link)

我很高兴听到关于如何实施它的建议! :)

维护一堆条件,只要有一个条件为假,就一直跳过行。在伪代码中:

 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

更好的方法是解析成包含明确定义的基本块和控制流图的 AST。

例如"if"(条件)构造可以表示为

conditional
|
-- test
-- consequent base block
-- [alternate bb]
-- [elseif 1]
    |
    -- test
    -- consequent
   ...

这种方法更加灵活,可以创建具有函数、循环、上下文等的完整语言

可以在 Builder 预处理器中看到很好的例子:https://github.com/electricimp/Builder