【问题标题】:Implementing if-condition in preprocessor在预处理器中实现 if 条件
【发布时间】:2016-04-25 07:53:38
【问题描述】:

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

我写的这个预处理器已经可以运行大部分的东西了,除了条件。所以,#ifdef#ifndef#else#endif 是我所坚持的。

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

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

【问题讨论】:

  • 它会防止看到带有关键字的字符串文字吗?
  • 你到底困在什么地方?你试过什么,什么没用?您能否在您的问题中发布相关代码?
  • @dandavis 定义的值按原样写入源。在这方面它就像 C 预处理器一样工作 - 也就是说,如果我没有错过任何东西。
  • @Bergi 我发布了整个代码。我被困在如何完全实现 if 逻辑的想法上。将 if 条件转换为 javascript 表达式然后处理嵌套 if 的最佳方法是什么,或者确切地说是它们的多个级别。我似乎在这里遇到了障碍……这就是我在这里问的原因。
  • @IngwiePhoenix:您没有发布任何代码,您发布了指向 github 的链接。

标签: javascript preprocessor


【解决方案1】:

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

 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

【讨论】:

  • 哦!所以你的意思是,一堆条件?嗯……这很有趣。我会试试这个,当它起作用时标记答案。谢谢你,当我开始工作时再次发表评论。
  • 已实施、测试、工作。 :) 谢谢你的回答!
【解决方案2】:

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

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

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

这种方法更加灵活,允许使用函数、循环、上下文等创建完整的语言。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2012-06-14
    • 2020-03-12
    • 2018-12-29
    • 1970-01-01
    相关资源
    最近更新 更多