在字符串文字中解析引号

时间:2017-05-26 16:30:44

标签: regex parsing antlr automata

为什么几乎所有语言的字符串都要求您转义引号?

例如,如果你有一个字符串,如

"hello world""

为什么语言要你把它写成

"hello world\""

您是否不仅要求字符串以引号开头和结尾?

您可以将结束报价视为字符串的终止报价。如果没有结束报价则会出现错误。您还可以假设字符串在一行上开始和结束,并且不跨越多行。

5 个答案:

答案 0 :(得分:1)

编译器如何知道哪个引号结束了字符串?

更新:

在C& C ++,这是一个非常好的字符串:

printf("Hel"   "lo" "," "Wor""ld"  "!");

打印Hello, World!

或者' bout是C#

Console.WriteLine("Hello, "+"World!");

现在应该打印Hello, World还是Hello, "+"World!

答案 1 :(得分:1)

否则,编译器会将第二个引号视为字符串的结尾,然后是随后的随机引号,从而导致错误。

"使用" escape"实际上意味着暂时逃避解析文本并进入另一种模式,其中后续角色的处理方式不同。"资料来源:https://softwareengineering.stackexchange.com/questions/112731/what-does-backslash-escape-character-really-escape

答案 2 :(得分:1)

假设我想将", "放入字符串文字中(因此文字包含引号)。

如果我没有逃脱就这样做,我会写"", ""。这看起来像是用逗号分隔的两个空字符串文字。例如,如果我想用这个字符串文字调用一个函数,我会写f("", "")。这看起来像编译器,我传递两个参数,都是空字符串。它怎么知道差异呢?

答案是,它不能。也许在像"hello world""这样的简单情况下,它至少可以解决一些语言问题。但是,对于不同的语言而言,明确且不需要转义的字符串集将是不同的,并且很难跟踪哪个是哪个,并且对于任何语言,将存在一些需要转义的模糊情况。编译器编写器更容易跳过所有这些边缘情况,并且总是要求您转义引号,对程序员来说可能也更容易。

答案 3 :(得分:0)

您必须转义第二个引号的原因是编译器知道引号是字符串的一部分,而不是终止符。如果你没有逃避它,编译器只会选择hello world而不是hello world"

答案 4 :(得分:0)

让我们做一个实际的例子。

如何翻译?

"Hello"+"World"
    'HelloWorld' or 'Hello"+"World'
vs
"Hello\"+\"World"

通过转义引号字符,可以消除歧义,代码应该对编译器有歧义。所有编译器都应该将相同的代码编译为相同的可执行文件。它基本上是一种告诉编译器的方式“我知道这看起来很奇怪,但我的意思是它应该是这样的”