我正在研究JS lexer作为我学习的一部分。在JS中,单行蜇从“或”开始并以相同的字符结尾,除非该字符前面有反斜杠。
在我目前的代码中,我……
许多语言(但不是全部)禁止在字符串文字中使用未转义的换行符。所以JavaScript在这里肯定不是唯一的。
但这种动机实际上与词汇分析的简易性,难度或效率无关。事实上,对于词法分析,最简单的语法是允许任何字符而不必包含特殊情况检查。 [注1]
但是还有其他一些考虑因素;值得注意的是,程序的可读性和易于调试的重要性。长字符串会给读取代码的人带来额外的负担,因为他们可能不知道程序文本的一部分实际上是字符串文字的一部分。 (多行注释存在类似的问题,这就是为什么通常以某种方式标记长注释中的每一行的好方式,例如在左边缘有一个垂直的星列。对于字符串不存在这样的解决方案文字虽然。)
此外,未终止的多行字符串可能很难纠正。如果字符串不能跨越行,则将在包含问题的行上检测到错误。但是多行字符串可能会持续到下一个字符串的开头,然后在下一个字符串的内容被意外解析为程序文本时触发语法错误。或者更糟糕的是,导致对应该是程序文本的完全不正确的解析,然后是另一个不正确的字符串文字,从第二个文字结束开始,并从那里继续。
这也使开发人员工具(如编辑器和语法高亮显示器)难以在键入时处理程序文本。
最后,您可能会或可能不会发现这些论点引人注目,语言设计师也可能有其他审美偏好。我不能真正代表JavaScript语言的原始设计师,我们都不能及时与他们争论并可能改变他们的决定。
无论好坏,语言都是根据特定的主观判断来设计的,如果语言成功,这些判断就会成为永久性的特征。如果你使用某种语言,它们是你必须接受的东西,而且它们通常不值得痴迷。你习惯了它们,或者你找到了一种不同的语言来编程,它有自己的语法怪癖。
当你设计自己的语言时,你需要解决大量的语法问题,毫无疑问,你会遇到答案不明确的情况,因为没有客观正确的独特解决方案。无论你做什么,都会有人想和你争论。也许你可以将他们推荐给这个答案。
实际上有一个历史原因是不允许多行字符串文字,这更加清晰,但几十年来或多或少都无关紧要。
从前,常见的文件系统认为文本文件是线性数组 定长线 (通常为80个字符行,与Hollerith卡相匹配)。这种文件系统的一个优点是它可以立即导航到文件中的特定行号,因为所有行都是相同的长度。但无论如何,对于在打孔卡上输入程序的系统,固定长度的线只是环境的一部分。
要使所有线条长度相同,需要用空格字符填充线条。这显然会使多行字符串文字变得笨拙,这就是为什么C从不允许多行字符串文字,而是依赖于句法特征,其中连续字符串文字自动连接成单个文字。
最后,固定行长度的文件系统被证明是不受欢迎的,我认为你最近不会遇到这种情况。但是仔细阅读C和Posix标准表明,这些文件系统仍然可以通过符合实现的方式使用,结果是必须准备一个完全可移植的程序来处理输出上的行长度限制和输入上的尾随空格。
还有这样的语法
const string = 'line1\ line2\ line3'