Compiler construction 以下语句中有多少代币?
如果我有如下陈述:Compiler construction 以下语句中有多少代币?,compiler-construction,token,Compiler Construction,Token,如果我有如下陈述: int 1xab; //statement 1 int 1 ; //statement 2 如果我计算其中的令牌数,那么根据我的说法,语句1中的令牌数是4,语句2中的令牌数是3 对于语句1: 我将1作为整数文本的标记,将xab作为 标识符 用于语句2 我用1作为整数文本的标记 方法正确吗 这里没有“正确”或“不正确”,除非您按照特定语言的规范工作。抽象地说,任何一种答案都是可能的(其他答案也是如此),不同的语言中存在着不同的可能性 在Python和许多其他语言
int 1xab; //statement 1
int 1 ; //statement 2
如果我计算其中的令牌数,那么根据我的说法,语句1中的令牌数是4,语句2中的令牌数是3
对于语句1:
- 我将1作为整数文本的标记,将xab作为 标识符
- 我用1作为整数文本的标记
- 在Python和许多其他语言中,
是两个标记。使用最大munch规则匹配初始整数,然后将1xab
作为第二个标记进行解析。在大多数这些语言中,没有一个标识符可以跟在标记后面的语法结构,因此无论如何都会触发语法错误,这种区别是学术性的xab
在C和C++中,整数字可以用字母标记加上。(例如,1llu是一个无符号的
long
integer literal。)C的设计者选择允许对这种词汇语法进行可能的扩展,因此任何以数字开头的字母数字字符字符串都被视为“pp数字”。[注1]
因此,如果要为现有语言实现处理器,则需要参考该语言的规范。如果您正在设计自己的语言,您可以选择您认为更方便的令牌定义
笔记
pp编号:
数字
. 数字
pp数字
pp编号标识符非数字
pp数字e符号
pp数字E符号
pp数字p符号
pp数字P符号
pp编号。
标志:其中一个
+ -
数字:其中一位
0 1 2 3 4 5 6 7 8 9
标识符非数字
是字母(仅指子集中的字母,即a到z和a到z)、下划线、unicode转义(“通用字符名”),前提是它位于有效代码点列表中,或“其他实现定义的字符”如果你正在构造一个编译器,那么就由你来定义标记。+1到@klutt,但我要指出,在案例1中,
1xab
是a)有效标识符,B)无效标识符还是C)两个标记是不明确的。当您控制标记划分逻辑时,建议不要创建模糊语法,但当我们谈论匹配字符的最长序列时,如果我看到1,那么如果我进入整型常量的自动机,如果我看到xab,那么它是定义的自动机中的其他(“其他”)东西,那么,为什么这在C语言中不能也是一个有效的标记呢?@radhika:这仅仅是因为“pp number”标记是由语言定义的。与大多数语言一样,C依赖于最长匹配规则,1xab
是pp-number的最长匹配。如果我谈论C语言,正如您所说,如果xab出现,因为它是一个无效的后缀,所以我们将其报告为词法错误,但为什么我们不能进入DFA的最终状态,它只有数字作为输入,我们甚至可以在不添加任何后缀的情况下使用DFA,因此在这种情况下,1将是一个令牌,而xab将是另一个令牌token@radhika:这本来是可能的,但语言设计者决定不这样做。这是他们的权利:)他们的推理是,有一天他们可能想把x
作为一个有效的后缀,在这种情况下,任何依赖1xab
正是1
和xab
的标记的旧程序都会突然有不同的行为。事实上,C++中的整数可以用任何标识符加上,允许使用包含测量单元的数字(<代码> 1KMK</代码>;下划线不需要在标准库中定义的后缀。参见)。这肯定是一个语法错误,而不是两个标记。在预处理阶段幸存下来的预处理令牌必须转换为令牌,并且1xab不是有效的令牌。但它仍然是一个单一的无效令牌。要证明这一点,请尝试这样做:#定义xab+2
。现在,如果1xab
是两个令牌,它将扩展到1+2
,这是完全有效的<代码>1 xab将展开。但是1xab
仍然是一个错误。
pp-number:
digit
. digit
pp-number digit
pp-number identifier-nondigit
pp-number e sign
pp-number E sign
pp-number p sign
pp-number P sign
pp-number .
sign: one of
+ -
digit: one of
0 1 2 3 4 5 6 7 8 9