Lez*_*zan 5 unicode antlr antlr3
我试图在文本中挑选所有令牌,并需要匹配所有Ascii和Unicode字符,所以这就是我如何摆出它们.
fragment CHAR : ('A'..'Z') | ('a'..'z');
fragment DIGIT : ('0'..'9');
fragment UNICODE : '\u0000'..'\u00FF';
Run Code Online (Sandbox Code Playgroud)
现在,如果我将令牌规则写为:
TOKEN : (CHAR|DIGIT|UNICODE)+;
Run Code Online (Sandbox Code Playgroud)
我得到"决定可以匹配输入,例如"'A'..'Z'"使用多种选择:1,3结果,替代(s)3被禁用该输入""决定可以匹配输入,如"' 0'..'9'"使用多个替代方案:2,3结果,替代(s)3被禁用该输入"
没有任何东西可以匹配:而且如果我把它写成
TOKEN : (UNICODE)+;
Run Code Online (Sandbox Code Playgroud)
什么都没有匹配.
有没有办法做到这一点.
如果您计划使用Unicode,另外要考虑的另一个问题是您应该设置charvocabulary选项以表示您要允许Unicode范围为0到FFFE中的任何char
options
{
charVocabulary='\u0000'..'\uFFFE';
}
Run Code Online (Sandbox Code Playgroud)
您通常会在示例中看到的默认值是
options
{
charVocabulary = '\3'..'\377';
}
Run Code Online (Sandbox Code Playgroud)
涵盖上述观点.通常,如果你需要ascii字符范围'A'..'Z'和unicode范围,你可以制作一个unicode词法分析器规则:
'\u0080'..'\ufffe'
实际上,TOKEN: (UNICODE)+完全没用.
由于所有内容都是令牌字符,因此,如果您尝试使用此类规则来匹配Java程序,那么它将简单地匹配整个程序并将其作为一个大令牌返回给您.
如果你想将你的输入分成有意义的片段,你真的需要将你的角色分成不同的组.
它可能会帮助您了解"专业人士"是如何做到的.这是Java的BNF语法,这里有一个标识符的BNF,它显示了他们如何解决问题
identifier
::= "a..z,$,_" { "a..z,$,_,0..9,unicode character over 00C0" }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9608 次 |
| 最近记录: |