在预处理器中实现 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
对于我的一个项目,我想在 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