Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Formatting 计算引号和格式化源代码_Formatting_Lua_Code Formatting_Double Quotes - Fatal编程技术网

Formatting 计算引号和格式化源代码

Formatting 计算引号和格式化源代码,formatting,lua,code-formatting,double-quotes,Formatting,Lua,Code Formatting,Double Quotes,我正在为我的Lua代码做一些基本的格式化。例如在数学操作数周围添加缺少的空格等 现在我意识到,如果我在引号之间(即,我不想改变代码中的字符串),那么进行这些格式化是一个非常糟糕的主意 解决这个问题的最简单方法是什么。到目前为止,我的想法是: 像我到目前为止所做的那样,执行一个regexp,以找到一个我想要编辑的位置,然后从字符串开始到这个位置计算引号。如果有奇数个引号,我就在一个带引号的字符串中 将行预拆分为引号内外的部分,并且仅格式化外部部分 我错过了什么明显的东西吗?更好的选择?我将采取

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

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

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

  • 像我到目前为止所做的那样,执行一个regexp,以找到一个我想要编辑的位置,然后从字符串开始到这个位置计算引号。如果有奇数个引号,我就在一个带引号的字符串中
  • 将行预拆分为引号内外的部分,并且仅格式化外部部分

我错过了什么明显的东西吗?更好的选择?

我将采取以下方法:

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

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

    由于Lua非常简单,因此最健壮的方法是为Lua语法实现一个解析器,该解析器只以标准样式发出解析后的代码。您可以将其破解到现有的解析器(lparser.c)中,或者使用lua用户wiki上的现有解析器之一。语法似乎是LL(1),因此一个简单的递归下降解析器或LPEG将是不错的选择


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

    我知道Eclipse和INtelliJ有Lua插件。也许您可以使用它们来重新格式化您的代码库?有一个更干净的替代方案,但它需要做更多的工作。将LUA代码解析为AST。从ASTs重新生成代码。如果你这样做,你永远不会感到困惑的是在一个字符串的中间;根据定义,这是一个单一的树节点。这还意味着您可以使用代码的结构(例如,IF…ELSE IF…ELSE IF…)来很好地格式化特殊情况。如果你不想经历这么多麻烦,你应该找到Astyle并为Lua解决它。使用引号计数技术,你会遇到一个明显的麻烦,就是转义引号,如下字符串:
    “\”
    @jpjacobs是的,这将是一条无止境的弯路(这就是为什么我接受了silentbicycle关于实现一个真正的解析器的回答。恐怕你是对的,regexp的诡计似乎有点太过潘多拉盒子了:D编写语法解析器是我没有做过的事情,但会让我想起大学课堂上的一些事情。)。。