using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
string StringRegex = "\"(?:[^\"\\\\]|\\\\.)*\"";
string IntegerRegex = @"[0-9]+";
string CommentRegex = @"//.*|/\*[\s\S]*\*/";
string KeywordRegex = @"\b(?:astart|ainput|atake|aloop|batcommand|batshow|batprint|batmult|batadd|batsub|batdiv|batif|batelse|batgo|batend|till|and)\b";
string DataTypeRegex = @"\b(?:int|string)\b";
string IdentifierRegex = @"\b[a-zA-Z]\b";
string ParenthesisRegex = @"\(|\)";
string BracesRegex = @"\{|\}";
string ArrayBracketRegex = @"\[|\]";
string PuncuationRegex = @"\;|\:|\,|\.";
string RelationalExpressionRegex = @"\>|\<|\==";
string ArthimeticOperatorRegex = @"\+|\-|\*|\/";
string WhitespaceRegex = @" ";
Dictionary<string, string> Regexes = new Dictionary<string, string>()
{
{"String", StringRegex},
{"Integer", IntegerRegex },
{"Comment", CommentRegex},
{"Keyword", KeywordRegex},
{"Datatype", DataTypeRegex },
{"Identifier", IdentifierRegex },
{"Parenthesis", ParenthesisRegex },
{"Brace", BracesRegex },
{"Square Bracket", ArrayBracketRegex },
{"Puncuation Mark", PuncuationRegex },
{"Relational Expression", RelationalExpressionRegex },
{"Arithmetic Operator", ArthimeticOperatorRegex },
{"Whitespace", WhitespaceRegex }
};
string input = "asdasdas"; // DEMO
// input = Convert.ToString(Console.ReadLine());
var matches = Regexes.SelectMany(a => Regex.Matches(input, a.Value)
.Cast<Match>()
.Select(b =>
new
{
Value = b.Value + "\n",
Index = b.Index,
Token= a.Key
}))
.OrderBy(a => a.Index).ToList();
if (matches.Count == 0)
Console.WriteLine("Not in grammar");
else
{
for (int i = 0; i < matches.Count; i++)
{
if (i + 1 < matches.Count)
{
int firstEndPos = (matches[i].Index + matches[i].Value.Length);
if (firstEndPos > matches[(i + 1)].Index)
{
matches.RemoveAt(i + 1);
i--;
}
}
}
foreach (var match in matches)
{
Console.WriteLine(match);
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCnB1YmxpYyBjbGFzcyBUZXN0CnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQkgICAgc3RyaW5nIFN0cmluZ1JlZ2V4ID0gIlwiKD86W15cIlxcXFxdfFxcXFwuKSpcIiI7CgkJICAgIHN0cmluZyBJbnRlZ2VyUmVnZXggPSBAIlswLTldKyI7CgkJICAgIHN0cmluZyBDb21tZW50UmVnZXggPSBAIi8vLip8L1wqW1xzXFNdKlwqLyI7CgkJICAgIHN0cmluZyBLZXl3b3JkUmVnZXggPSBAIlxiKD86YXN0YXJ0fGFpbnB1dHxhdGFrZXxhbG9vcHxiYXRjb21tYW5kfGJhdHNob3d8YmF0cHJpbnR8YmF0bXVsdHxiYXRhZGR8YmF0c3VifGJhdGRpdnxiYXRpZnxiYXRlbHNlfGJhdGdvfGJhdGVuZHx0aWxsfGFuZClcYiI7CgkJICAgIHN0cmluZyBEYXRhVHlwZVJlZ2V4ID0gQCJcYig/OmludHxzdHJpbmcpXGIiOwoJCSAgICBzdHJpbmcgSWRlbnRpZmllclJlZ2V4ID0gQCJcYlthLXpBLVpdXGIiOwoJCSAgICBzdHJpbmcgUGFyZW50aGVzaXNSZWdleCA9IEAiXCh8XCkiOwoJCSAgICBzdHJpbmcgQnJhY2VzUmVnZXggPSBAIlx7fFx9IjsKCQkgICAgc3RyaW5nIEFycmF5QnJhY2tldFJlZ2V4ID0gQCJcW3xcXSI7CgkJICAgIHN0cmluZyBQdW5jdWF0aW9uUmVnZXggPSBAIlw7fFw6fFwsfFwuIjsKCQkgICAgc3RyaW5nIFJlbGF0aW9uYWxFeHByZXNzaW9uUmVnZXggPSBAIlw+fFw8fFw9PSI7CgkJICAgIHN0cmluZyBBcnRoaW1ldGljT3BlcmF0b3JSZWdleCA9IEAiXCt8XC18XCp8XC8iOwoJCSAgICBzdHJpbmcgV2hpdGVzcGFjZVJlZ2V4ID0gQCIgIjsKCQkgICAgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gUmVnZXhlcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpCgkJICAgIHsKCQkgICAgICAgIHsiU3RyaW5nIiwgU3RyaW5nUmVnZXh9LAoJCSAgICAgICAgeyJJbnRlZ2VyIiwgSW50ZWdlclJlZ2V4IH0sCgkJICAgICAgICB7IkNvbW1lbnQiLCBDb21tZW50UmVnZXh9LAoJCSAgICAgICAgeyJLZXl3b3JkIiwgS2V5d29yZFJlZ2V4fSwKCQkgICAgICAgIHsiRGF0YXR5cGUiLCBEYXRhVHlwZVJlZ2V4IH0sCgkJICAgICAgICB7IklkZW50aWZpZXIiLCBJZGVudGlmaWVyUmVnZXggfSwKCQkgICAgICAgIHsiUGFyZW50aGVzaXMiLCBQYXJlbnRoZXNpc1JlZ2V4ICB9LAoJCSAgICAgICAgeyJCcmFjZSIsIEJyYWNlc1JlZ2V4IH0sCgkJICAgICAgICB7IlNxdWFyZSBCcmFja2V0IiwgQXJyYXlCcmFja2V0UmVnZXggfSwKCQkgICAgICAgIHsiUHVuY3VhdGlvbiBNYXJrIiwgUHVuY3VhdGlvblJlZ2V4IH0sCgkJICAgICAgICB7IlJlbGF0aW9uYWwgRXhwcmVzc2lvbiIsIFJlbGF0aW9uYWxFeHByZXNzaW9uUmVnZXggfSwKCQkgICAgICAgIHsiQXJpdGhtZXRpYyBPcGVyYXRvciIsIEFydGhpbWV0aWNPcGVyYXRvclJlZ2V4IH0sCgkJICAgICAgICB7IldoaXRlc3BhY2UiLCBXaGl0ZXNwYWNlUmVnZXggfQoJCSAgICB9OwoJCQoJCSAgICBzdHJpbmcgaW5wdXQgPSAiYXNkYXNkYXMiOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBERU1PCgkJICAgIC8vIGlucHV0ID0gQ29udmVydC5Ub1N0cmluZyhDb25zb2xlLlJlYWRMaW5lKCkpOwoJCQoJCSAgICB2YXIgbWF0Y2hlcyA9IFJlZ2V4ZXMuU2VsZWN0TWFueShhID0+IFJlZ2V4Lk1hdGNoZXMoaW5wdXQsIGEuVmFsdWUpCgkJICAgIC5DYXN0PE1hdGNoPigpCgkJICAgIC5TZWxlY3QoYiA9PgoJCSAgICAgICAgICAgIG5ldwoJCSAgICAgICAgICAgIHsgICAgCgkJICAgICAgICAgICAgICAgIFZhbHVlID0gYi5WYWx1ZSArICJcbiIsCgkJICAgICAgICAgICAgICAgIEluZGV4ID0gYi5JbmRleCwKCQkgICAgICAgICAgICAgICAgVG9rZW49IGEuS2V5IAoJCSAgICAgICAgICAgIH0pKQoJCSAgICAuT3JkZXJCeShhID0+IGEuSW5kZXgpLlRvTGlzdCgpOwoJCSAgICBpZiAobWF0Y2hlcy5Db3VudCA9PSAwKQoJCSAgICAJQ29uc29sZS5Xcml0ZUxpbmUoIk5vdCBpbiBncmFtbWFyIik7CgkJICAgIGVsc2UKCQkgICAgewoJCQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVzLkNvdW50OyBpKyspCgkJCSAgICB7CgkJCSAgICAgICAgaWYgKGkgKyAxIDwgbWF0Y2hlcy5Db3VudCkKCQkJICAgICAgICB7CgkJCSAgICAgICAgICAgIGludCBmaXJzdEVuZFBvcyA9IChtYXRjaGVzW2ldLkluZGV4ICsgbWF0Y2hlc1tpXS5WYWx1ZS5MZW5ndGgpOwoJCQkgICAgICAgICAgICBpZiAoZmlyc3RFbmRQb3MgPiBtYXRjaGVzWyhpICsgMSldLkluZGV4KQoJCQkgICAgICAgICAgICB7CgkJCSAgICAgICAgICAgICAgICBtYXRjaGVzLlJlbW92ZUF0KGkgKyAxKTsKCQkJICAgICAgICAgICAgICAgIGktLTsKCQkJICAgICAgICAgICAgfQoJCQkgICAgICAgIH0KCQkJICAgIH0KCQkJICAgIGZvcmVhY2ggKHZhciBtYXRjaCBpbiBtYXRjaGVzKQoJCQkgICAgewoJCQkgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKG1hdGNoKTsKCQkJICAgIH0KCQkgICAgfQoJfQp9