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 に答える