问题描述
以下代码产生了哪个错误?根据我目前阅读的信息,语法错误主要在编译时被识别,语义错误在运行时被识别。那么下面的代码会不会抛出语法错误?
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 确实可以是发出错误的代理,因为它已经设置为需要一个没有参数的裸关键字,在这个过程的早期。因此,这种实现是语法问题,但语义分析已应用于更早的修改解析器。
简而言之,这取决于您的定义。如果选择的定义与工具的实现有关,那么你就不能抽象地说。