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作为 标识符
用于语句2

  • 我用1作为整数文本的标记
方法正确吗

这里没有“正确”或“不正确”,除非您按照特定语言的规范工作。抽象地说,任何一种答案都是可能的(其他答案也是如此),不同的语言中存在着不同的可能性

  • 在Python和许多其他语言中,
    1xab
    是两个标记。使用最大munch规则匹配初始整数,然后将
    xab
    作为第二个标记进行解析。在大多数这些语言中,没有一个标识符可以跟在标记后面的语法结构,因此无论如何都会触发语法错误,这种区别是学术性的

  • 在C和C++中,整数字可以用字母标记加上。(例如,1llu是一个无符号的
    long
    integer literal。)C的设计者选择允许对这种词汇语法进行可能的扩展,因此任何以数字开头的字母数字字符字符串都被视为“pp数字”。[注1]

因此,如果要为现有语言实现处理器,则需要参考该语言的规范。如果您正在设计自己的语言,您可以选择您认为更方便的令牌定义


笔记
  • “Pp数字”还可以包含小数点(.)和指数(E+),并且可以以小数点开头,后跟数字。所以这比那要复杂一点。最近的C++版本也允许使用“作为一个分组符号,以更容易的方式编写更大的整数。” 为清楚起见,以下是预处理数字的C词汇语法(C11标准§6.4.8):

    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