Я пытаюсь написать очень простой парсер в С#.
Мне нужен лексер - что-то, что позволяет связать регулярные выражения с токенами, поэтому он читает в регулярных выражениях и возвращает мне символы.
Кажется, что я должен использовать Regex для фактического тяжелого подъема, но я не вижу простого способа сделать это. Во-первых, Regex работает только на строках, а не на потоках (почему это??!?).
В принципе, я хочу реализовать следующий интерфейс:
interface ILexer : IDisposable
{
/// <summary>
/// Return true if there are more tokens to read
/// </summary>
bool HasMoreTokens { get; }
/// <summary>
/// The actual contents that matched the token
/// </summary>
string TokenContents { get; }
/// <summary>
/// The particular token in "tokenDefinitions" that was matched (e.g. "STRING", "NUMBER", "OPEN PARENS", "CLOSE PARENS"
/// </summary>
object Token { get; }
/// <summary>
/// Move to the next token
/// </summary>
void Next();
}
interface ILexerFactory
{
/// <summary>
/// Create a Lexer for converting a stream of characters into tokens
/// </summary>
/// <param name="reader">TextReader that supplies the underlying stream</param>
/// <param name="tokenDefinitions">A dictionary from regular expressions to their "token identifers"</param>
/// <returns>The lexer</returns>
ILexer CreateLexer(TextReader reader, IDictionary<string, object> tokenDefinitions);
}
Итак, pluz отправляет codz...
Нет, серьезно, я вот-вот начну писать реализацию вышеупомянутого интерфейса, но мне трудно поверить, что в .NET(2.0) уже нет простого способа сделать это.
Итак, какие-либо предложения по простому способу сделать выше? (Кроме того, мне не нужны "генераторы кода". Производительность не важна для этой вещи, и я не хочу вводить какую-либо сложность в процесс сборки.)