【问题标题】:Use other words for the same functionality of a reserved keyword in JavaScript使用其他词来实现 JavaScript 中保留关键字的相同功能
【发布时间】:2020-11-03 22:16:15
【问题描述】:

我正在探索语言解释器和编译器,以构建一个小型国际编译器,该编译器将 JavaScript (对英文保留字)稍作修改即可编译为 vanilla JS。

修改后的 JS 示例:

notfor(notlet i=0; i<5; i++) {
    ...
}

*显然“notfor”和“notlet”不会是真正的关键字

原版 JS 编译:

for(let i=0; i<5; i++) {
    ...
}

我尝试过 RegEx 方法,但我不断发现 RegEx 失败的边缘情况。

Ex. /notfor(.*)/,当 notfor(..){..} 放在字符串中或在初始化、条件或最终的任何部分有右括号时,此操作将失败-for 语句的表达式。

解决这个问题的另一种简单方法是什么?

【问题讨论】:

  • 我会编写一个解析器,将字符串文字和模板文字与实际代码分开,然后使用正则表达式仅替换实际代码中的 notfor 等。这是可行的——我以前做过——但它需要大量的代码和努力。大部分的复杂性是由于模板文字的${}s。
  • 好主意,一定要试试
  • @CertainPerformance 您愿意分享您的解析器的至少一点 sn-p 吗?我在使用包含关键字的变量名时遇到问题。前任。 “notlet anotletvar”被编译为“let aletvar”而不是“let anotletvar”,正如你所说,我仍然遇到模板文字和字符串的问题

标签: javascript node.js compilation


【解决方案1】:

CertainPerformance 建议我将字符串与其他代码分开,这样解析器就可以简单地替换字符串之外的内容,而不必担心更改用户制作的字符串。这只是我深夜的方法,我确信有更好的方法可以做到,但这会很好。

let code = fs.readFileSync('./code.js', {encoding:'utf8', flag:'r'}).split('\n')
let compiled = ''
code.forEach(line => {
    line.split(/(?=["'`])/).forEach(analLine => {
        if (!analLine.match(/^["'`].*/)) {
            compiled += analLine.replace('notlet', 'let')
                                .replace('notfor', 'for')
        } else {
            compiled += analLine
        }
    })
    compiled += '\n'
})
console.log(compiled)
eval(compiled)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2012-01-24
    • 2013-09-15
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多