1

単純なレクサーとして .NET Regex を使用しています。

var pattern = new Regex("(?<if>if)|(?<then>then)|(?<int>\-?\d+)...");
var tokens = pattern.Matches(input).Cast<Match>()
    .Select(m => new Token { Text = m.Value, Type = TokenTypes.First(tt => !string.IsNullOrEmpty(m.Groups[tt].Value) });

照合後、トークンの種類を表すすべての名前付きグループを反復処理し、実際に一致したものを見つけることで、各トークンの種類を特定できます。ただし、これは少し遅くて不器用に思えます。.NET Regex API を使用して、一致するすべてのグループを見つけるより良い方法はありますか?

4

1 に答える 1

0

私は本当にそれで何の問題も見ません。ただし、空の文字列を許可するグループがない場合は、グループの をSuccessチェックする代わりにプロパティを使用できますValue。これは本質的にあなたがすでに持っているものですが、私の意見ではこれはもう少しエレガントに思えます:

var tokens = pattern.Matches(input).Cast<Match>()
    .Select(m => new Token { Text = m.Value, Type = TokenTypes.First(tt => m.Groups[tt].Success) });

またはクエリ構文で:

var tokens = 
    from Match m in pattern.Matches(input)
    select new Token 
    { 
        Text = m.Value, 
        Type = TokenTypes.First(tt => m.Groups[tt].Success) 
    };
于 2013-11-20T03:34:54.527 に答える