将一种语法嵌入另一种语法中:是拼凑还是聪明?
-
21-08-2019 - |
题
背景: 最近,在查看“结构化文本编辑器”时,我注意到他们使用了一种技巧来更改 python/perl/c++/java 等。通过将 XML 隐藏到相应语言的注释中,形成“结构化”大纲。
我记得曾经在 Windows bat 文件中看到过这个技巧。bat 文件的 REM 语句用于“隐藏”一些 perl 代码。
问题: 您是否见过有人使用编程或标记语言的注释来嵌入完全不同语言的语法的实例?如果是,您能否提供该示例的链接或解释一下它是什么?
如果你还没有,这里有一个例子:
问题: 这种“伎俩”是不是一个聪明又有用的主意呢?如果是这样,您能列举一个使用此技巧的特殊实例吗?如果不是,您能描述一下为什么您认为这是一个坏主意吗?
解决方案
你说的是 多语言者, ,计算机编程的一个绝对令人着迷的方面,也是对某些脚本/编程语言的模糊性的精彩练习。虽然这绝对是一个有趣的概念,但它们很少出现在新奇的领域之外。然而,从编码员的角度来看,让你的工作在几个截然不同的环境中运行绝对是一项壮举;然而,由于多语言者通常依赖于通过评论进行的各种黑客攻击和解决方法,这几乎总是超出了可行性范围。不过,如果您还没有看到它们的功能,那么绝对值得一看;我会推荐 这个.
不管你相信与否,该单个文件将正确编译(以某种方式、形状或形式)十五种不同的语言:
- 超文本标记语言
- 巴什
- 桀骜
- C89
- C99
- C++
- 生成文件
- 红宝石
- 铊
- 珀尔
- 哈斯克尔
- Python
- JavaScript
- 脑残
- 空白
其他提示
我无法给您完整的答案,但 Netbean 喜欢在其 Java 生成的代码中使用此技巧。
问题是,Java源代码应该是应用程序之间的媒介。通过为某些评论添加含义,您将被迫只使用 Netbeans。当然,其他程序可以忽略这些注释,但是如果这些注释被移动或更改怎么办?我已经在 Netbeans 中完成了该操作,然后当我尝试将文件加载回 Netbeans 时,出现了一些奇怪的情况。我必须花时间来修复我认为不可见的语法(在注释中!)。
就我个人而言,如果现有文件需要多个非本地修改,我永远不会为其添加更多含义(也就是说,在一条注释中具有含义是可以的,但从该注释到该注释没有含义)。在大多数情况下,我肯定会添加另一个包含所需元数据的文件。
这个恐怖事件插入了有效的 XHTML、HTML 和 HTML3.2 之前的 tagoup,并使用 CSS 注释“隐藏”标记:
<style type="text/css"><!--/*--><![CDATA[/*><!--*/
...
/*]]>*/--></style>
当我开始看到它实际使用时,我感到很羞愧。这只是作为练习。对不起。
我见过这个技巧(在注释中隐藏内容),用于折叠编辑器,用于各种工具中的文档标记,以及用于在建模工具中为往返工作留下面包屑。
我见过的另一个用途是 齿轮, ,代码生成器。您在注释中编写 python,然后 Cog 运行 python 来生成代码。这很有趣,因为重点是永远不需要/不想修改生成的代码,因此它不会遇到与您遇到的相同的烦恼,例如,当您不小心弄乱“折叠”注释时,使用折叠编辑器在不同的编辑器中。
Visual Studio 有一种称为 T4 的形式。不幸的是,该文档有点粗略。
Python 文档中最喜欢使用的一种标记是 重组文本. 。它是一种通用的简化标记语言,如 Markdown 或 Textile,但它具有良好的文档结构,并且可以轻松用于生成 HTML 或 PDF 文档。
Donald Knuth 的 WEB 和 CWEB 将 Pascal (WEB) 和 C (CWEB) 嵌入到 TeX 中。以下是 METAFONT 源代码的示例:
@ The following system-independent code makes the |xord| array contain a
suitable inverse to the information in |xchr|. Note that if |xchr[i]=xchr[j]|
where |i<j<@'177|, the value of |xord[xchr[i]]| will turn out to be
|j| or more; hence, standard ASCII code numbers will be used instead of
codes below @'40 in case there is a coincidence.
@<Set init...@>=
for i:=first_text_char to last_text_char do xord[chr(i)]:=@'177;
for i:=@'200 to @'377 do xord[xchr[i]]:=i;
for i:=0 to @'176 do xord[xchr[i]]:=i;