在 C# 中,如果词法标记以字母或下划线开头,则被识别为标识符或关键字,如果以数字开头,则被识别为数字。
在此上下文中的字母不限于[A-Za-z]
; 它可以是任何 Unicode 字母,由char.IsLetter
.
[0-9]
为了识别数字文字,是否有任何外部字符类似地被识别为数字?
答案是否定的,但它比这更复杂。
如果你看一下语言规范,你就会明白我的意思:
integer_literal
: decimal_integer_literal
| hexadecimal_integer_literal
;
decimal_integer_literal
: decimal_digit+ integer_type_suffix?
;
decimal_digit
: '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
;
integer_type_suffix
: 'U' | 'u' | 'L' | 'l' | 'UL' | 'Ul' | 'uL' | 'ul' | 'LU' | 'Lu' | 'lU' | 'lu'
;
hexadecimal_integer_literal
: '0x' hex_digit+ integer_type_suffix?
| '0X' hex_digit+ integer_type_suffix?
;
hex_digit
: '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
| 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';
如您所见,+
or-
不是整数文字规范的一部分,因此对于此规则的开头,它始终需要一个数字(0-9
对于十进制整数,和0
,后跟x
对于十六进制整数)。
规则解析比仅仅检查第一个字符以确定要遵循哪个规则更复杂。阅读 ANTLR 前瞻方法(LL(*))会让你学到很多。简单地说,整个规则必须解析,否则将无法解析该规则。它不仅仅基于规则的开始。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句