以下陈述中有多少令牌?

时间:2018-03-19 10:50:11

标签: compiler-construction token

如果我有以下陈述:

int 1xab; //statement 1
int 1 ;   //statement 2

如果我去计算其中的令牌数量,那么根据我的说法,声明1中的令牌数不是4而声明2中的令牌数是3。

对于陈述1

  • 我有1作为整数文字的标记,xab作为标记 标识符。

对于陈述2

  • 我有1作为整数文字的标记。

方法是否正确?

1 个答案:

答案 0 :(得分:1)

除非您正在使用特定语言的规范,否则此处没有“正确”或“不正确”。在摘要中,任何一种答案都是可能的(和其他答案一样),不同语言中存在不同的可能性。

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

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

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

注释

  1. “Pp-numbers”还可以包含小数点()和指数( E + ),并且可以以小数点后跟数字开头。所以它比那复杂一点。最近的C ++版本还允许使用'作为分组符号,以便以可读的方式更容易地编写大整数。

    为清楚起见,这里是预处理数字的C词法语法(C11标准的第6.4.8节):

    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
    

    identifier-non-digit是一个字母(只有Basic Latin子集中的字母,即 a z A Z ), _ 下划线,unicode转义(“通用字符名称”),前提是它位于有效代码点列表中,或“其他实现定义的字符” ”