在unicode中编写语法规则名称[ANTLR 4]

时间:2015-06-03 08:28:04

标签: java parsing unicode antlr antlr4

我仍然是ANTLR 4的初学者,我想知道是否有办法在unicode中编写语法规则名称。例如,以下规则很好:

atomExp returns [double value] : n=Number {$value = Double.parseDouble($n.text);} | '(' exp=additionExp ')' {$value = $exp.value;} ;

但是,假设我想编写相同的规则但不是将其名称写为“atomExp”,而是将该名称写为阿拉伯语单词“تعبير”

تعبير returns [double value] : n=Number {$value = Double.parseDouble($n.text);} | '(' exp=additionExp ')' {$value = $exp.value;} ;

但是当我尝试以这种方式编写时,我得到“没有可行的替代”错误。有人可以解决我的问题。提前致谢

1 个答案:

答案 0 :(得分:1)

查看the lexer grammar for ANTLR4时,您会发现词法分析器和解析器名称支持某些Unicode字符:

/** Allow unicode rule/token names */
ID  :   NameStartChar NameChar*;

fragment
NameChar
    :   NameStartChar
    |   '0'..'9'
    |   '_'
    |   '\u00B7'
    |   '\u0300'..'\u036F'
    |   '\u203F'..'\u2040'
    ;

fragment
NameStartChar
    :   'A'..'Z'
    |   'a'..'z'
    |   '\u00C0'..'\u00D6'
    |   '\u00D8'..'\u00F6'
    |   '\u00F8'..'\u02FF'
    |   '\u0370'..'\u037D'
    |   '\u037F'..'\u1FFF'
    |   '\u200C'..'\u200D'
    |   '\u2070'..'\u218F'
    |   '\u2C00'..'\u2FEF'
    |   '\u3001'..'\uD7FF'
    |   '\uF900'..'\uFDCF'
    |   '\uFDF0'..'\uFFFD'
    ; // ignores | ['\u10000-'\uEFFFF] ;

INT : [0-9]+
       ;

但您的身份تعبير似乎不符合NameChar*规则的ID部分。