在哪个过程中发生语法错误?(标记或解析)


23

我正在尝试了解编译和解释,逐步找出总体图像。因此,在阅读http://www.cs.man.ac.uk/~pjj/farrell/comp3.html本文时,我遇到一个问题

它说 :

编译器的下一个阶段称为解析器。编译器的这一部分对语言的语法有所了解。它负责识别语法错误,并将无错误程序转换为可以用另一种语言解释或写出的内部数据结构。

但是我无法弄清楚令牌化器如何正确地令牌化具有语法错误的给定流。

它应该卡在此处或向解析器提供一些错误的信息。我的意思是标记化不是一种翻译器吗?

因此,它如何在标记化时克服了词汇中的错误代码行。

Tokenizer标题上方的链接中有一个令牌示例。

据我了解,令牌的形式似乎是,如果代码中有错误,令牌也会被破坏。

您能澄清一下我的误会吗?

Answers:


32

分词器只是解析器优化。完全没有标记器的情况下实现解析器是完全可能的。

令牌生成器(或词法分析器或扫描器)将输入切成令牌列表。字符串的某些部分(注释,空格)通常被忽略。每个令牌都有一个类型(该字符串在语言中的含义)和一个值(构成令牌的字符串)。例如,PHP源代码片段

$a + $b

可以用令牌表示

Variable('$a'),
Plus('+'),
Variable('$b')

令牌生成器不会考虑在这种情况下是否可以使用令牌。例如,输入

$a $b + +

会愉快地产生令牌流

Variable('$a'),
Variable('$b'),
Plus('+'),
Plus('+')

当解析器使用这些令牌时,它将注意到两个变量不能跟随,两个中缀运算符也不能。(请注意,其他语言具有不同的语法,在这种语法中,这样的令牌流可能是合法的,但在PHP中不是)。

解析器可能仍在令牌生成器阶段失败。例如,可能存在非法字符:

$a × ½ — 3

PHP令牌生成器将无法将该输入与其规则匹配,并且将在主解析开始之前产生错误。

更正式地说,当每个令牌都可以描述为常规语言时,将使用令牌生成器。然后可以非常高效地匹配令牌,可能将其实现为DFA。相反,主要语法通常是无上下文的,并且需要更复杂,性能更差的解析算法,例如LALR。


因此,我们可以认为令牌生成器是解析器的一部分,并且语法错误可以根据语法错误形式在令牌化步骤或解析步骤中发生。感谢您的澄清。
FZE

4
@FZE:您可能会这样想,但这是一种误导。乐兴不是“仅仅是解析器优化”。相反,词汇化将物理表示(某些字符序列)映射到逻辑表示(这些字符表示的标记)。这样可以将解析器与细节隔离开来,例如如何表示行尾,或者是否决定表示逻辑和,and或,&&或其他东西。它(大多数)是独立的,与解析不同。优化(如果有)几乎是偶然的副作用。
杰里·科芬,2016年

@JerryCoffin感谢您的进一步解释,它现在变得更有意义。
FZE

2
@ JerryCoffin,amon是正确的,区别不是根本。您可以创建涵盖“词法分析器”和“解析器”部分的内聚BNF语法。我们通常将规则分为低级(例如,数字,加法运算符)和高级(求和),但是语法本身没有这种区别。
Paul Draper

1
@PaulDraper不确定将常规语言作为第一阶段是否是正确的选择。例如,可能需要使用匹配对(非常规)来描述某些语言中的字符串文字,但是在第一阶段处理它们仍然有意义。避免/减少回溯似乎是一个更好的指南。
CodesInChaos

16

通常,通常希望大多数语法错误来自解析器,而不是词法分析器。

如果(大部分情况下)输入中的某些内容无法标记,则词法分析器将生成错误。但是,在许多语言中,几乎任何字符序列都可以转换为某种形式的标记,因此这里的错误相当少见。

如果输入包含有效标记,则解析器将生成错误,但是这些标记未排列,因此它们以目标语言形成有效的语句/表达式。通常这是更常见的。


11

令牌生成器只是将字符流拆分为令牌。从令牌生成器POV完全有效:

1 * * 1

并转换为以下内容:["1", MULTIPLY, MULTIPLY, "1"] 只有解析器可以拒绝此类表达式-它知道乘法运算符不能跟随另一个乘法运算符。例如,在JavaScript中,这将产生:

Uncaught SyntaxError: Unexpected token *(…)

标记化程序可能检测到错误。例如,未完成的字符串文字:"abc或无效数字:0x0abcdefg。尽管它们仍然可能被报告为语法错误:

Uncaught SyntaxError: Unexpected token ILLEGAL

请注意,但是令牌未被识别,并报告为ILLEGAL

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.