【问题标题】:Counting quotes and formatting source code计算引号和格式化源代码
【发布时间】:2012-12-27 03:30:31
【问题描述】:

我正在为我的 Lua 代码做一些基本的格式化。比如在数学操作数周围添加缺失的空格等。

现在我意识到,如果我在引号之间(即我不想更改代码中的字符串),那么进行这些格式化是一个非常糟糕的主意。

解决这个问题最优雅的方法是什么。到目前为止我的想法:

  • 像我目前所做的那样做一个正则表达式来找到一个我想要编辑的地方,然后从字符串的开头计算到这个地方的引号。如果有奇数个引号,我在一个带引号的字符串中。
  • 将行预拆分为引号内和引号外的部分,并且仅格式化外部部分。

我是否遗漏了一些明显的东西?更好的选择?

【问题讨论】:

  • 我知道 Eclipse 和 INtelliJ 都有 Lua 插件。也许您可以使用它们来重新格式化您的代码库?
  • 有一个更干净的替代方案,但它的工作量更大。将 LUA 代码解析为 AST。从 AST 重新生成代码。如果你这样做了,你永远不会对处于字符串中间感到困惑。根据定义,这是一个树节点。这也意味着您可以使用代码的结构(例如,IF ... ELSE IF ... ELSE IF ...)很好地格式化特殊情况。如果你不想经历这么多麻烦,你应该得到 Astyle 并为 Lua 破解它。
  • 使用引号计数技术会遇到麻烦的一个明显的事情是转义引号,如以下字符串:"\""
  • @jpjacobs 是的,这将是一条无穷无尽的极端案例。 :(这就是为什么我接受了silentbicycle关于实现真正解析器的回答。

标签: formatting lua code-formatting double-quotes


【解决方案1】:

我将采取的方法如下:

  1. 用编号模式替换代码中的所有字符串,例如$1$$2$$3$... 当然,您可以将每个整数索引的原始字符串保存在表格中。
  2. 制作您想要的任何格式(但请确保不要修改模式)。
  3. $%n+$ 模式替换为原始字符串。

【讨论】:

    【解决方案2】:

    您所描述的通常被称为“漂亮的打印机”。

    由于 Lua 的 grammar 如此简单,最可靠的方法是实现 Lua 语法的解析器,它只以标准样式发出已解析的代码。您可以将其破解到现有的解析器 (lparser.c) 中,或使用 lua-users wiki 上现有的 grammars 之一。语法似乎是 LL(1),因此简单的递归下降解析器或 LPEG 将是不错的选择。

    尝试使用 only 正则表达式执行此操作几乎总是会导致比仅使用真正的解析器更多的工作,因为越来越多的特殊情况和上下文信息(例如,计算嵌套括号)潜入正则表达式.

    【讨论】:

    • 恐怕你是对的,正则表达式的诡计似乎有点太潘多拉魔盒 :D 编写语法解析器是我没有做过的事情,但会带回一些大学课程的回忆..跨度>
    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多