在预处理器中实现if-condition

时间:2015-07-20 22:34:02

标签: javascript preprocessor

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

我编写的这个预处理器已经有大部分工作,除了条件。因此,#ifdef#ifndef#else#endif是我所坚持的。

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

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

2 个答案:

答案 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