C#是否识别以0-9以外的数字开头的数字?

C#是否识别以0-9以外的数字开头的数字?,c#,unicode,C#,Unicode,在C#中,如果词法标记以字母或下划线开头,则将其识别为标识符或关键字;如果词法标记以数字开头,则将其识别为数字 此上下文中的字母不限于[A-Za-z];它可以是任何Unicode字母,由char.isleter识别 [0-9]之外的任何字符是否同样被识别为数字,以识别数字文字?答案是否定的,但它比这更复杂 如果你看,你会明白我的意思: integer_literal : decimal_integer_literal | hexadecimal_integer_literal

在C#中,如果词法标记以字母或下划线开头,则将其识别为标识符或关键字;如果词法标记以数字开头,则将其识别为数字

此上下文中的字母不限于
[A-Za-z]
;它可以是任何Unicode字母,由
char.isleter
识别


[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';
正如您所看到的,
+
-
不是整数文字规范的一部分,因此对于该规则的开始,它总是需要一个数字(十进制整数为
0-9
,十六进制整数为
0
,后面紧跟
x


规则解析比仅仅检查第一个字符以确定遵循哪个规则更复杂。阅读ANTLRs前瞻性方法()会让你学到很多。简单地说,整个规则必须解析,否则它将无法解析该规则。这不仅仅是基于规则的开始。

答案是否定的,但它比这更复杂

如果你看,你会明白我的意思:

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';
正如您所看到的,
+
-
不是整数文字规范的一部分,因此对于该规则的开始,它总是需要一个数字(十进制整数为
0-9
,十六进制整数为
0
,后面紧跟
x



规则解析比仅仅检查第一个字符以确定遵循哪个规则更复杂。阅读ANTLRs前瞻性方法()会让你学到很多。简单地说,整个规则必须解析,否则它将无法解析该规则。它不仅仅是基于规则的开头。

您是否在寻找类似十六进制文字的东西,例如,
0x12ab
?@HimBromBeere例如,阿拉伯数字(٠、١、٢、٣等)都被识别为数字,并且Number@HimBrobBeere
'\u0E51'
(泰国排名第一)例如,您必须包装自己的类。如果您有十六进制数,它将使用a-f表示数字。您可以创建基本(任何基本)算术类,其中数字可以是unicode字符。否。很难猜测这个问题背后的动机,但是Roslyn允许你根据自己的意愿改变规则。更改。您是否正在寻找类似十六进制文字的内容,例如,
0x12ab
?@HimBromBeere例如,阿拉伯数字(٠、١、٣等)都被识别为数字,并且Number@HimBrobBeere
'\u0E51'
(泰国排名第一)例如,您必须包装自己的类。如果您有十六进制数,它将使用a-f表示数字。您可以创建基本(任何基本)算术类,其中数字可以是unicode字符。否。很难猜测这个问题背后的动机,但是Roslyn允许你根据自己的意愿改变规则。改变,“不”?真正地那么为什么
Char.IsDigit('၉')
return
true
?问题是关于语法分析器/词法分析器,
char.IsDigit
与它完全无关。@那么,为什么OP谈论
char.isleter
?因为OP认为它们之间有些关联,好像语法分析器是用C#或其他语言编写的@Rafalon@Rafalon第一句话显然是关于解析器的,而不是l语言实现本身。“不”?真的吗?那为什么
Char.IsDigit('၉')
return
true
?问题是关于语法分析器/词法分析器,
char.IsDigit
与它完全无关。@那么,为什么OP谈论
char.isleter
?因为OP认为它们之间有些关联,好像语法分析器是用C#或其他语言编写的@Rafalon@Rafalon第一句话显然是关于解析器的,而不是l语言实现本身。