C# 多方案决策匹配

C# 多方案决策匹配,c#,antlr,lexer,C#,Antlr,Lexer,我正在尝试为以下规则获取匹配项,该规则将匹配运算符标识符,但没有匹配项,特别是在匹配==和的行上。: Symbol : ( U_Sm | U_So | U_Sc | '\u0080' .. '\u007F' | '==' '='* | '..' '.'* )+ ; 带有U\U前缀的规则指的是unicode组lexer片段。我已经从U\U Sm片段中删除了=

我正在尝试为以下规则获取匹配项,该规则将匹配运算符标识符,但没有匹配项,特别是在匹配
==
的行上。

Symbol
    :   (   U_Sm
        |   U_So
        |   U_Sc
        |   '\u0080' .. '\u007F'
        |   '==' '='*
        |   '..' '.'*
        )+
    ;
带有
U\U
前缀的规则指的是unicode组lexer片段。我已经从
U\U Sm
片段中删除了
=
字符,所以这应该不是问题

有效标识符可以是以下各项:

warning(200): Hydra.g3:6:18: Decision can match input such as "'='<EOT>" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input

warning(200): Hydra.g3:7:18: Decision can match input such as "'.'<EOT>" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input

error(201): Hydra.g3:8:9: The following alternatives can never be matched: 4
  • ==
  • ==

  • 范围
    '\u0080'..'\u007F'
    无效,因为
    0x80
    大于
    0x7F

    ANTLR似乎对嵌套重复有问题:
    (…(…)+…)+
    。尽管ANTLR的
    +
    *
    默认情况下是贪婪的(除了
    *
    +
    ),但在这种嵌套重复中,似乎需要显式告诉ANTLR匹配ungreedy或贪婪(在您的情况下是贪婪的)

    以下规则不会产生任何错误:

    符号
    :(U_Sm)
    |乌苏
    |U_Sc
    |'\u007F'..'\u0080'
    |“==”(选项{greedy=true;}:“=”)*
    |“…”(选项{greedy=true;}:'。)*
    )+
    ;
    
    范围
    '\u0080'..'\u007F'
    无效,因为
    0x80
    大于
    0x7F

    ANTLR似乎对嵌套重复有问题:
    (…(…)+…)+
    。尽管ANTLR的
    +
    *
    默认情况下是贪婪的(除了
    *
    +
    ),但在这种嵌套重复中,似乎需要显式告诉ANTLR匹配ungreedy或贪婪(在您的情况下是贪婪的)

    以下规则不会产生任何错误:

    符号
    :(U_Sm)
    |乌苏
    |U_Sc
    |'\u007F'..'\u0080'
    |“==”(选项{greedy=true;}:“=”)*
    |“…”(选项{greedy=true;}:'。)*
    )+
    ;
    
    Hi Bart,我已将测试语法上传到google docsOkay,稍后我会查看。请注意,最好在此处发布语法,而不要使用外部链接,因为外部链接可能会消失,从而使您的问题(和可能的答案)不完整。Bart,unicode组导致语法为4kb,我不确定是否允许使用如此大的代码块!另外,再次感谢您的时间!嗨,巴特,我已经上传了一个测试语法到谷歌docsOkay,稍后我会看一看。请注意,最好在此处发布语法,而不要使用外部链接,因为外部链接可能会消失,从而使您的问题(和可能的答案)不完整。Bart,unicode组导致语法为4kb,我不确定是否允许使用如此大的代码块!另外,再次感谢您的时间!我怎么会错过那个7F-80小组!你真是个天才!我知道这与内部团体有关,我以前尝试过贪婪的选择,但肯定是哪里出了问题!非常感谢。事实上,它最初是20-7F(来自PHP或Scala标识符),结果我不想要那一行,谢谢提醒我!“…使用多个选项:1,2”1,2是什么意思?它们指向哪里?@iuliux,解析器规则由一个或多个可选的解析器组成。以解析器规则
    r
    为例:
    r:A | B | C
    ,由三个备选方案组成:
    A
    B
    C
    。我怎么会错过那个7F-80小组!你真是个天才!我知道这与内部团体有关,我以前尝试过贪婪的选择,但肯定是哪里出了问题!非常感谢。事实上,它最初是20-7F(来自PHP或Scala标识符),结果我不想要那一行,谢谢提醒我!“…使用多个选项:1,2”1,2是什么意思?它们指向哪里?@iuliux,解析器规则由一个或多个可选的解析器组成。以解析器规则
    r
    为例:
    r:A | B | C,由三个备选方案组成:
    A
    B
    C
    grammar Test;
    
    program :
        Symbol
        ;
    
    Symbol
        :   (   U_Sm
            |   U_So
            |   U_Sc
            |   '\u0080' .. '\u007F'
            |   '==' '='*
            |   '..' '.'*
            )+
        ;
    
    fragment U_Sm
        :   '\u002B'
        | '\u003C' | '\u003E' 
        | '\u007C' | '\u007E'
        | '\u00AC' | '\u00B1'
        | '\u00D7' | '\u00F7'
        | '\u03F6'
        | '\u0606' .. '\u0608' 
        | '\u2044' | '\u2052'
        | '\u207A' .. '\u207C' 
        | '\u208A' .. '\u208C' 
        | '\u2140' .. '\u2144' 
        | '\u214B'
        | '\u2190' .. '\u2194' 
        | '\u219A' | '\u219B'
        | '\u21A0' | '\u21A3'
        | '\u21A6' | '\u21AE'
        | '\u21CE' | '\u21CF'
        | '\u21D2' | '\u21D4'
        | '\u21F4' .. '\u22FF' 
        | '\u2308' .. '\u230B' 
        | '\u2320' | '\u2321'
        | '\u237C'
        | '\u239B' .. '\u23B3' 
        | '\u23DC' .. '\u23E1' 
        | '\u25B7' | '\u25C1'
        | '\u25F8' .. '\u25FF' 
        | '\u266F'
        | '\u27C0' .. '\u27C4' 
        | '\u27C7' .. '\u27CA' 
        | '\u27CC'
        | '\u27D0' .. '\u27E5' 
        | '\u27F0' .. '\u27FF' 
        | '\u2900' .. '\u2982' 
        | '\u2999' .. '\u29D7' 
        | '\u29DC' .. '\u29FB' 
        | '\u29FE' .. '\u2AFF' 
        | '\u2B30' .. '\u2B44' 
        | '\u2B47' .. '\u2B4C' 
        | '\uFB29' | '\uFE62'
        | '\uFE64' .. '\uFE66' 
        | '\uFF0B'
        | '\uFF1C' .. '\uFF1E' 
        | '\uFF5C' | '\uFF5E'
        | '\uFFE2'
        | '\uFFE9' .. '\uFFEC' 
        ;
    
    fragment U_So
        :   '\u00A6' | '\u00A7'
        | '\u00A9' | '\u00AE'
        | '\u00B0' | '\u00B6'
        | '\u0482' | '\u060E'
        | '\u060F' | '\u06E9'
        | '\u06FD' | '\u06FE'
        | '\u07F6' | '\u09FA'
        | '\u0B70'
        | '\u0BF3' .. '\u0BF8' 
        | '\u0BFA' | '\u0C7F'
        | '\u0CF1' | '\u0CF2'
        | '\u0D79'
        | '\u0F01' .. '\u0F03' 
        | '\u0F13' .. '\u0F17' 
        | '\u0F1A' .. '\u0F1F' 
        | '\u0F34' | '\u0F36'
        | '\u0F38'
        | '\u0FBE' .. '\u0FC5' 
        | '\u0FC7' .. '\u0FCC' 
        | '\u0FCE' | '\u0FCF'
        | '\u0FD5' .. '\u0FD8' 
        | '\u109E' | '\u109F'
        | '\u1360'
        | '\u1390' .. '\u1399' 
        | '\u1940'
        | '\u19E0' .. '\u19FF' 
        | '\u1B61' .. '\u1B6A' 
        | '\u1B74' .. '\u1B7C' 
        | '\u2100' | '\u2101'
        | '\u2103' .. '\u2106' 
        | '\u2108' | '\u2109'
        | '\u2114'
        | '\u2116' .. '\u2118' 
        | '\u211E' .. '\u2123' 
        | '\u2125' | '\u2127'
        | '\u2129' | '\u212E'
        | '\u213A' | '\u213B'
        | '\u214A' | '\u214C'
        | '\u214D' | '\u214F'
        | '\u2195' .. '\u2199' 
        | '\u219C' .. '\u219F' 
        | '\u21A1' | '\u21A2'
        | '\u21A4' | '\u21A5'
        | '\u21A7' .. '\u21AD' 
        | '\u21AF' .. '\u21CD' 
        | '\u21D0' | '\u21D1'
        | '\u21D3'
        | '\u21D5' .. '\u21F3' 
        | '\u2300' .. '\u2307' 
        | '\u230C' .. '\u231F' 
        | '\u2322' .. '\u2328' 
        | '\u232B' .. '\u237B' 
        | '\u237D' .. '\u239A' 
        | '\u23B4' .. '\u23DB' 
        | '\u23E2' .. '\u23E8' 
        | '\u2400' .. '\u2426' 
        | '\u2440' .. '\u244A' 
        | '\u249C' .. '\u24E9' 
        | '\u2500' .. '\u25B6' 
        | '\u25B8' .. '\u25C0' 
        | '\u25C2' .. '\u25F7' 
        | '\u2600' .. '\u266E' 
        | '\u2670' .. '\u26CD' 
        | '\u26CF' .. '\u26E1' 
        | '\u26E3'
        | '\u26E8' .. '\u26FF' 
        | '\u2701' .. '\u2704' 
        | '\u2706' .. '\u2709' 
        | '\u270C' .. '\u2727' 
        | '\u2729' .. '\u274B' 
        | '\u274D'
        | '\u274F' .. '\u2752' 
        | '\u2756' .. '\u275E' 
        | '\u2761' .. '\u2767' 
        | '\u2794'
        | '\u2798' .. '\u27AF' 
        | '\u27B1' .. '\u27BE' 
        | '\u2800' .. '\u28FF' 
        | '\u2B00' .. '\u2B2F' 
        | '\u2B45' | '\u2B46'
        | '\u2B50' .. '\u2B59' 
        | '\u2CE5' .. '\u2CEA' 
        | '\u2E80' .. '\u2E99' 
        | '\u2E9B' .. '\u2EF3' 
        | '\u2F00' .. '\u2FD5' 
        | '\u2FF0' .. '\u2FFB' 
        | '\u3004' | '\u3012'
        | '\u3013' | '\u3020'
        | '\u3036' | '\u3037'
        | '\u303E' | '\u303F'
        | '\u3190' | '\u3191'
        | '\u3196' .. '\u319F' 
        | '\u31C0' .. '\u31E3' 
        | '\u3200' .. '\u321E' 
        | '\u322A' .. '\u3250' 
        | '\u3260' .. '\u327F' 
        | '\u328A' .. '\u32B0' 
        | '\u32C0' .. '\u32FE' 
        | '\u3300' .. '\u33FF' 
        | '\u4DC0' .. '\u4DFF' 
        | '\uA490' .. '\uA4C6' 
        | '\uA828' .. '\uA82B' 
        | '\uA836' | '\uA837'
        | '\uA839'
        | '\uAA77' .. '\uAA79' 
        | '\uFDFD' | '\uFFE4'
        | '\uFFE8' | '\uFFED'
        | '\uFFEE' | '\uFFFC'
        | '\uFFFD'
        ;
    
    fragment U_Sc
        :   '\u0024'
        |   '\u00A2' .. '\u00A5'
        |   '\u060B' | '\u09F2'
        |   '\u09F3' | '\u09FB'
        |   '\u0AF1' | '\u0BF9'
        |   '\u0E3F' | '\u17DB'
        |   '\u20A0' .. '\u20B8'
        |   '\uA838' | '\uFDFC'
        |   '\uFE69' | '\uFF04'
        |   '\uFFE0' | '\uFFE1'
        |   '\uFFE5' | '\uFFE6'
        ;