我正在编写一个小的csharp控制台应用程序,它从控制台读取文本,执行一些操作并返回一个字符串。为此,我使用的是Antlr。语法文件如下所示。
grammar test;
options {
language = CSharp2;
output = AST;
}
start returns [String res]: expression EOF
{
$res=$expression.res;
} ;
expression returns [String res]
: Identifier {$res=$Identifier.text}
|Num {$res=$num.text;
|function {$res=function.res}
;
function: 'left' '( Identifier ')'{some code here}
| 'right' '( Identifier ')'{some code here}
|..........
;
Num : (Minus)?('0'..'9')+ ;
Identifier : ('a'..'z'|'A'..'Z'|'\\'|'/'|'_'|':'|';'|'?'|'.'|'0'..'9')('a'..'z'|'A'..'Z'|'\\'|'/'|'_'|':'|';'|'.'|'?'|'0'..'9')*;
我有几个这样的函数可以进行一些字符串操作。现在,我希望Antlr无论如何都能识别这些函数名称。目前,它只接受小写字母作为函数名称,例如.. upper(asdf)。我无法在我的应用程序中将每个标记转换为小写,因为它也会更改标识符的大小写。我怎样才能做到这一点?
答案 0 :(得分:8)
只需定义适当的令牌即可。所以,对于上面的代码:
function : Left '(' Identifier ')' {some code here}
| ..........
;
Left : ('l'|'L')('e'|'E')('f'|'F')('t'|'T');
或者,如果您确定要包含lEfT
:
function : Left '(' Identifier ')' {some code here}
| ..........
;
Left : ('left'|'LEFT');
答案 1 :(得分:4)
LEFT : [Ll] [Ee] [Ff] [Tt];
如果所有规则都不区分大小写,那么
使用仅小写
在将要编译的字符串传递给词法分析器之前,请将字符串设为小写
答案 2 :(得分:-1)
你可以使用 选项 { 区分大小写= FALSE } 保持不区分大小写的词法分析器