用 unicode [ANTLR 4] 编写语法规则名称
write a grammar rule name in unicode [ANTLR 4]
我还是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;}
;
但是当我尝试以这种方式编写时,出现 "no viable alternative" 错误。有人可以解决我的问题吗?提前致谢
查看 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]+
;
但您的 ID تعبير
似乎不符合 ID
规则的 NameChar*
部分。
我还是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;}
;
但是当我尝试以这种方式编写时,出现 "no viable alternative" 错误。有人可以解决我的问题吗?提前致谢
查看 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]+
;
但您的 ID تعبير
似乎不符合 ID
规则的 NameChar*
部分。