以下一行有什么作用?
#line 25 "CSSGrammar.y"
扩展名是什么?
答案 0 :(得分:12)
根据标准:
§16.4.3:
表单
的预处理指令# line digit-sequence new-line
使实现的行为就像下面的源行序列以源行开头一样 具有由数字序列指定的行号(解释为十进制整数)。如果是数字 sequence指定零或大于2147483647的数字,行为未定义。
§16.4.4:
表单
的预处理指令# line digit-sequence " s-char-sequenceopt" new-line
类似地设置假定的行号,并将源文件的假定名称更改为内容 字符串文字。
§16.4.5:
表单
的预处理指令允许使用# line pp-tokens new-line
(与前两种形式中的一种不匹配)。行前预处理令牌 在指令上处理就像在普通文本中一样(当前定义为宏名称的每个标识符是 替换为其预处理令牌的替换列表)。如果指令在所有替换之后产生 与前两个表单中的一个不匹配,行为未定义;否则,处理结果 酌情。
.y
扩展名正是作者选择使用的,也许是为了表明它是一个YACC文件(“语法”这个词也指向了它,虽然它只是一个猜测)。
答案 1 :(得分:8)
它只是声明当前的代码行来自CSSGrammar.y
的第25行,这是一个YACC样式的语法文件,它是生成此代码的地方。
调试器可以使用它来进入语法本身而不是生成的代码。
答案 2 :(得分:4)
#line
指令修改编译器的报告位置,并由代码生成软件用于帮助程序员识别原始源中的问题。任何人都可以使用它来帮助重定向错误报告以提供更多信息。
因此,例如你的解析器生成一个CSSGrammar.cpp文件,由c ++编译器编译,并且其中包含c ++片段,#line 25 "CSSGrammar.y"
指令告诉c ++编译器处理文件中的特定点好像它是来自CSSGrammar.y的第25行
编译器将继续解析后续行并在该指令的初始条件下报告错误。
因此,如果3行之后发生错误,则会报告在CSSGrammar.y的第28行发生错误
请注意,单个源文件可以包含来自多个部分的源;并且该指令可以非常有效地用于指示错误条件。
通常情况下,您会看到一路上有多个#line
指令;他们只是在那里考虑各种注射(如果你愿意,重置报告插入符号)。
请注意,#line指令可以由包含您自己的任何生成器使用,并且不限于任何解析器生成器。
答案 3 :(得分:2)
'yacc'解析器生成器使用以.y结尾的文件,并发出包含c或c ++的文件。它添加了这些#line行,允许调试器返回原始源代码,不接受任何替代。
答案 4 :(得分:2)
指令编译器认为以下行是文件CSSGrammar.y
中的第25行。然后,如果编译器在第二行的第二行检测到错误,则会报告它来自CSSGrammar.y
的第26行
生成C文件的程序,例如bison
,yacc
,flex
或ANTLR,甚至(过时的)MELT使用这种可能性很多。
如果生成调试信息(例如使用gcc -g
),它将指向示例中的CSSGrammar.y
文件。
答案 5 :(得分:1)
这是一个预处理器选项。它告诉c-parser丢弃源文件的行数假装,这是第25行。
使用此信息,您可以更轻松地调试源文件。 yacc文件将被转换为c-source,这是假装的源代码行。
答案 6 :(得分:0)
使用#line会强制编译器在对其正在编译的文件和所处的行上进行记忆删除,并加载新数据。
注意:编译器仍然从其所在的行进行编译。