此代码在 C 中生成哪种类型的错误?语法还是语义?

问题描述

以下代码产生了哪个错误?根据我目前阅读的信息,语法错误主要在编译时被识别,语义错误在运行时被识别。那么下面的代码会不会抛出语法错误

void f(){
    return 0;
}

解决方法

在编译时检测到此错误。

“语法错误”的含义通常包括一些超出形式语法的分析,特别是因为编译器很可能是使用递归下降解析器实现的,或者嵌入的逻辑超出了正式解析器的纯数学将需要。特别是 C,需要词法分析器和解析器之间的一些反馈,并且不能成为纯粹的上下文无关语法解析器。 (如果你有兴趣,那是因为 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="210mm" height="297mm" viewBox="0 0 210 297" version="1.1" id="svg8" inkscape:version="1.0.1 (3bc2e813f5,2020-09-07)" sodipodi:docname="drawing.svg"> <defs id="defs2"> <rect x="60.47619" y="99.785714" width="74.839286" height="34.017857" id="rect24" /> </defs> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.35" inkscape:cx="400" inkscape:cy="560" inkscape:document-units="mm" inkscape:current-layer="layer1" inkscape:document-rotation="0" showgrid="false" inkscape:window-width="1267" inkscape:window-height="728" inkscape:window-x="83" inkscape:window-y="0" inkscape:window-maximized="0" /> <metadata id="metadata5"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title></dc:title> </cc:Work> </rdf:RDF> </metadata> <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"> <text xml:space="preserve" id="text22" style="font-weight:bold;font-size:10.5833px;line-height:1.25;font-family:'Bookman Old Style';-inkscape-font-specification:'Bookman Old Style Bold';text-align:center;white-space:pre;shape-inside:url(#rect24)" x="0" y="0"><tspan x="85.936012" y="109.17887"><tspan style="text-align:center;text-anchor:middle">Test</tspan></tspan></text> </g> </svg> 名称在遵循语法时必须理解为类型)

如果您是开发人员,您会称其为“语法错误”,因为它很容易被编译器发现,自然而然地作为生成代码需要理解的一部分。它不需要比它必须做的更深入的静态分析。

如果您是一名学习解析器和语法的 CS 学生,您会注意到它语法是正确的,但错误在于所陈述的内容。这意味着它不是语法错误,而是语义错误。

这种形式上的区别在现实生活中并不是很有用,因为真正的语言需要一些语义知识才能解析。所以 parser 确实可以是发出错误的代理,因为它已经设置为需要一个没有参数的裸关键字,在这个过程的早期。因此,这种实现是语法问题,但语义分析已应用于更早的修改解析器。

简而言之,这取决于您的定义。如果选择的定义与工具的实现有关,那么你就不能抽象地说。