Нужно разработать лексический анализатор - C#
Формулировка задачи:
Нужно разработать лексический анализатор, получающий на вход строку и выделяющий из неё лексемы
Лексемы записываются в формате: код лексемы; пробел; выделенная лексема;
виды лексем: десятичные числа(целые и вещественные); арифметическая операция;
идентификаторы - буквы;
Можно код пожалуйста
Пример:
целые числа - код 1, арифметическая операция - код 2, идентификаторы - код 3.
исходная строка
23*b+a04*2
Массив лексем
1)23
2)*
3)b
2)+
3)a04
2)*
1)2
Решение задачи: «Нужно разработать лексический анализатор»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace CleanConsole { internal struct Lexem { public readonly int Id; public readonly string Value; public Lexem(int id, string value) { Id = id; Value = value; } } internal static class LexicalAnalyzer { private static List<string> InitializePatterns() { var patterns = new List<string>(); patterns.Add(@"\d+(?![\,\d])"); patterns.Add(@"\d+\,\d+"); patterns.Add(@"[\+\-\s*/]"); patterns.Add(@"[_a-zA-Z][_a-zA-Z0-9]*"); return patterns; } private static string WrapInParentheses(string s) { return @"(" + s + @")"; } private static Regex BuildRegex(List<string> patterns) { var pattern = new StringBuilder(); pattern.Append(@"\G(?:"); pattern.Append(patterns.Select(WrapInParentheses).Aggregate((a, b) => a + "|" + b)); pattern.Append(@")"); return new Regex(pattern.ToString()); } private static readonly Regex ReadyRegex = BuildRegex(InitializePatterns()); public static IEnumerable<Lexem> Parse(string text) { var matches = ReadyRegex.Matches(text); int lastIndex = 0; foreach (Match match in matches) { var capture = match.Captures.Cast<Capture>().First(); int id = RetrieveId(match); string value = capture.Value; yield return new Lexem(id, value); lastIndex = capture.Index + capture.Length; } if (lastIndex != text.Length) throw new InvalidOperationException("Unexpected end of text"); } private static int RetrieveId(Match match) { for (int i = 1; true; ++i) if (match.Groups[i].Success) return i; } } internal class Program { static void Main(string[] args) { string text = Console.ReadLine() ?? ""; var lexems = LexicalAnalyzer.Parse(text); foreach (var lexem in lexems) { Console.WriteLine(lexem.Id + " " + lexem.Value); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д