2

我正在编写一个小型 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)。我无法在我的应用程序中将每个标记都转换为小写,因为它也会更改标识符的大小写。我怎样才能做到这一点?

4

3 回答 3

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');
于 2012-07-07T13:14:55.253 回答
4

不区分大小写的标准方法是

LEFT : [Ll] [Ee] [Ff] [Tt];

如果所有规则都不区分大小写,则

  1. 仅使用小写创建语法

  2. 在将要编译的字符串传递给词法分析器之前,将字符串设为小写

于 2014-03-19T00:14:53.800 回答
-1

您可以使用选项 { caseSensitive=false } 来维护不区分大小写的词法分析器

于 2015-03-10T06:55:50.087 回答