public void TestLexerOutput() { var test = "class test <<< \"str\"'name' 0.3 "; var lexer = new StringLexer(test); var tokens = lexer.LexData(); var enumerator = tokens.GetEnumerator(); enumerator.MoveNext(); // Match a keyword Assert.AreEqual(enumerator.Current.Type, TokenType.Class); enumerator.MoveNext(); // Match a word Assert.AreEqual(enumerator.Current.Value, "test"); enumerator.MoveNext(); // Match a delimiter with higher priority Assert.AreEqual(enumerator.Current.Type, TokenType.LeftShift); enumerator.MoveNext(); // Match another delimiter Assert.AreEqual(enumerator.Current.Type, TokenType.LeftArrow); enumerator.MoveNext(); // Match a string Assert.AreEqual(enumerator.Current.Value, "str"); enumerator.MoveNext(); // Match a name Assert.AreEqual(enumerator.Current.Value, "name"); enumerator.MoveNext(); // Match a number Assert.AreEqual(enumerator.Current.Value, "0.3"); enumerator.MoveNext(); // Assert that we are at the end of stream Assert.IsFalse(enumerator.MoveNext()); }
public void TestLexerOutput() { var test = "class test <<< \"str\"'name' 0.3 "; var lexer = new StringLexer(test); var tokens = lexer.LexData(); var enumerator = tokens.GetEnumerator(); enumerator.MoveNext(); // Match a keyword Assert.AreEqual(enumerator.Current.Type, TokenType.Class); enumerator.MoveNext(); // Match a word Assert.AreEqual(enumerator.Current.Value, "test"); enumerator.MoveNext(); // Match a delimiter with higher priority Assert.AreEqual(enumerator.Current.Type, TokenType.LeftShift); enumerator.MoveNext(); // Match another delimiter Assert.AreEqual(enumerator.Current.Type, TokenType.LeftArrow); enumerator.MoveNext(); // Match a string Assert.AreEqual(enumerator.Current.Value, "str"); enumerator.MoveNext(); // Match a name Assert.AreEqual(enumerator.Current.Value, "name"); enumerator.MoveNext(); // Match a number Assert.AreEqual(enumerator.Current.Value, "0.3"); enumerator.MoveNext(); // Assert that we are at the end of stream Assert.IsFalse(enumerator.MoveNext()); }
public void TestLexerTokenPositions() { String source = "+135.2 \n 'hello'\n\n"; var lexer = new StringLexer(source); // Check that the initial token has correct start and end positions var token = lexer.GetNextToken(); Assert.AreEqual(token.StartPosition, new SourcePosition(0, 0, 0)); Assert.AreEqual(token.EndPosition, new SourcePosition(0, 1, 1)); // Check that matching a number token reports expected result token = lexer.GetNextToken(); Assert.AreEqual(token.StartPosition, new SourcePosition(0, 1, 1)); Assert.AreEqual(token.EndPosition, new SourcePosition(0, 6, 6)); // Check that a newline is handled correctly var whitespace = lexer.GetNextToken(); Assert.AreEqual(whitespace.StartPosition, new SourcePosition(0, 6, 6)); Assert.AreEqual(whitespace.EndPosition, new SourcePosition(1, 1, 9)); // Check that name literal reports as expected token = lexer.GetNextToken(); Assert.AreEqual(token.StartPosition, new SourcePosition(1, 1, 9)); Assert.AreEqual(token.EndPosition, new SourcePosition(1, 8, 16)); // Check that several newlines are handled correctly whitespace = lexer.GetNextToken(); Assert.AreEqual(whitespace.StartPosition, new SourcePosition(1, 8, 16)); Assert.AreEqual(whitespace.EndPosition, new SourcePosition(3, 0, 18)); // Assert that EOF is returned at the end of the stream Assert.AreEqual(lexer.GetNextToken().Type, TokenType.EOF); }
public void ShouldReturnNoTokensWhenNoMatchersAreDefined() { var stringLexer = new StringLexer("hello world", new List <StringMatcherBase>()); var tokens = stringLexer.Tokenize(); Assert.AreEqual(0, tokens.Count()); }
public void ShouldReturnNoTokensWhenTheSourceIsEmpty() { var stringLexer = new StringLexer(string.Empty, new List <StringMatcherBase>()); var tokens = stringLexer.Tokenize(); Assert.AreEqual(0, tokens.Count()); }
public void ShouldStopReturningTokensWhenAnUnknownTokenIsEncountered() { var stringLexer = new StringLexer("hello world", new List <StringMatcherBase> { new MatchWord(new List <StringMatcherBase>()) }); var tokens = stringLexer.Tokenize(); Assert.AreEqual(1, tokens.Count()); }
public void TestQuotedStringParse() { StringLexer l = new StringLexer("''"); Assert.IsTrue(l.Parse(), "Не пропускает ''"); l = new StringLexer("'aa#2N3@_3-x//45'"); Assert.IsTrue(l.Parse(), "Не пропускает 'aa#2N3@_3-x//45'"); l = new StringLexer("'23 3 a'"); Assert.IsTrue(l.Parse(), "Не пропускает '23 3 a'"); }
static void Main(string[] args) { string source = "void main(){return Add(1, 2);}int Add(int num1, int num2){num1 = num1 + num2; return num2;}\0"; var lexer = new StringLexer(source); var tokens = lexer.Tokenize(); foreach (var token in tokens) { Console.WriteLine(token); } }
public void ShouldReturnAListOfTokensFromTheSource() { var stringLexer = new StringLexer("hello world", new List <StringMatcherBase> { new MatchWhiteSpace(), new MatchWord(new List <StringMatcherBase>()) }); var tokens = stringLexer.Tokenize().ToList(); Assert.AreEqual(3, tokens.Count()); Assert.AreEqual("Word - hello", tokens.ElementAt(0).ToString()); Assert.AreEqual("WhiteSpace - ", tokens.ElementAt(1).ToString()); Assert.AreEqual("Word - world", tokens.ElementAt(2).ToString()); }
public void TestLexerSubData() { String source = "+ \n \nasd , hey"; var lexer = new StringLexer(source); var tokens = lexer.LexSubData(new SourcePosition(1, 0, 4), new SourcePosition(2, 3, 8)); var enumerator = tokens.GetEnumerator(); enumerator.MoveNext(); // Ensure that the token has correct positions var token = enumerator.Current; Assert.AreEqual(token.StartPosition, new SourcePosition(2, 0, 5)); Assert.AreEqual(token.EndPosition, new SourcePosition(2, 3, 8)); // Make sure that the lexer did not parse further than the end of the subdata Assert.IsFalse(enumerator.MoveNext()); }
public void TestQuotedStringFail() { StringLexer l = new StringLexer("'"); Assert.Throws <LexerException>(() => { l.Parse(); }, "Пропускает '"); l = new StringLexer("aa'"); Assert.Throws <LexerException>(() => { l.Parse(); }, "Пропускает aa'"); l = new StringLexer("b 'add'"); Assert.Throws <LexerException>(() => { l.Parse(); }, "Пропускает b 'add'"); l = new StringLexer("'add' d"); Assert.Throws <LexerException>(() => { l.Parse(); }, "Пропускает 'add' d"); }
public void TestLexerGetToken() { String source = "+ \n \"asd"; var lexer = new StringLexer(source); // Match that the first token is a + Assert.AreEqual(lexer.GetNextToken().Type, TokenType.PlusSign); // Ensure that whitespace is returned Assert.AreEqual(lexer.GetNextToken().Type, TokenType.WhiteSpace); // Assert that an invalid token is found on a non-terminated string Assert.AreEqual(lexer.GetNextToken().Type, TokenType.INVALID); // Assert that after an invalid token the stream advances Assert.AreEqual(lexer.GetNextToken().Value, "asd"); // Assert that EOF is returned at the end of the stream Assert.AreEqual(lexer.GetNextToken().Type, TokenType.EOF); }
public void TestLexerGetToken() { String source = "+ \n \"asd"; var lexer = new StringLexer(source); // Match that the first token is a + Assert.AreEqual(lexer.GetNextToken().Type, TokenType.PlusSign); // Ensure that whitespace is returned Assert.AreEqual(lexer.GetNextToken().Type, TokenType.WhiteSpace); // Assert that an invalid token is found on a non-terminated string Assert.AreEqual(lexer.GetNextToken().Type, TokenType.INVALID); // Assert that after an invalid token the stream advances Assert.AreEqual(lexer.GetNextToken().Value, "asd"); // Assert that EOF is returned at the end of the stream Assert.AreEqual(lexer.GetNextToken().Type, TokenType.EOF); }
public void TestLexerSubData() { String source = "+ \n \nasd , hey"; var lexer = new StringLexer(source); var tokens = lexer.LexSubData(new SourcePosition(1, 0, 4), new SourcePosition(2, 3, 8)); var enumerator = tokens.GetEnumerator(); enumerator.MoveNext(); // Ensure that the token has correct positions var token = enumerator.Current; Assert.AreEqual(token.StartPosition, new SourcePosition(2, 0, 5)); Assert.AreEqual(token.EndPosition, new SourcePosition(2, 3, 8)); // Make sure that the lexer did not parse further than the end of the subdata Assert.IsFalse(enumerator.MoveNext()); }
public CodeOwnersParserContext(string content) { _entries = new List <CodeOwnersEntry>(); _lexer = new StringLexer(content); }
public void TestLexerTokenPositions() { String source = "+135.2 \n 'hello'\n\n"; var lexer = new StringLexer(source); // Check that the initial token has correct start and end positions var token = lexer.GetNextToken(); Assert.AreEqual(token.StartPosition, new SourcePosition(0, 0, 0)); Assert.AreEqual(token.EndPosition, new SourcePosition(0, 1, 1)); // Check that matching a number token reports expected result token = lexer.GetNextToken(); Assert.AreEqual(token.StartPosition, new SourcePosition(0, 1, 1)); Assert.AreEqual(token.EndPosition, new SourcePosition(0, 6, 6)); // Check that a newline is handled correctly var whitespace = lexer.GetNextToken(); Assert.AreEqual(whitespace.StartPosition, new SourcePosition(0, 6, 6)); Assert.AreEqual(whitespace.EndPosition, new SourcePosition(1, 1, 9)); // Check that name literal reports as expected token = lexer.GetNextToken(); Assert.AreEqual(token.StartPosition, new SourcePosition(1, 1, 9)); Assert.AreEqual(token.EndPosition, new SourcePosition(1, 8, 16)); // Check that several newlines are handled correctly whitespace = lexer.GetNextToken(); Assert.AreEqual(whitespace.StartPosition, new SourcePosition(1, 8, 16)); Assert.AreEqual(whitespace.EndPosition, new SourcePosition(3, 0, 18)); // Assert that EOF is returned at the end of the stream Assert.AreEqual(lexer.GetNextToken().Type, TokenType.EOF); }
public static void Main() { string input = "154216"; Lexer L = new IntLexer(input); try { L.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } //Задание 1 System.Console.WriteLine("\nTask 1:"); input = "0"; Lexer L1 = new NewIntLexer(input); try { L1.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = ""; L1 = new NewIntLexer(input); try { L1.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "365"; L1 = new NewIntLexer(input); try { L1.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "-22"; L1 = new NewIntLexer(input); try { L1.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "4-2"; L1 = new NewIntLexer(input); try { L1.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } //Задание 2 System.Console.WriteLine("\nTask 2:"); input = ""; Lexer L2 = new IDLexer(input); try { L2.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "d"; L2 = new IDLexer(input); try { L2.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "da236E0"; L2 = new IDLexer(input); try { L2.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "2abcd"; L2 = new IDLexer(input); try { L2.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } //Задание 3 System.Console.WriteLine("\nTask 3:"); input = ""; Lexer L3 = new NewIntLexer2(input); try { L3.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "25"; L3 = new NewIntLexer2(input); try { L3.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "-73060"; L3 = new NewIntLexer2(input); try { L3.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "012"; L3 = new NewIntLexer2(input); try { L3.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } // Задание 4 System.Console.WriteLine("\nTask 4:"); input = "a"; Lexer L4 = new LetterDigitLexer(input); try { L4.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "a1b2c3"; L4 = new LetterDigitLexer(input); try { L4.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "aa2b3c"; L4 = new LetterDigitLexer(input); try { L4.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "r4c2n"; L4 = new LetterDigitLexer(input); try { L4.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "0a9u5"; L4 = new LetterDigitLexer(input); try { L4.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } // Задание 5 System.Console.WriteLine("\nTask 5:"); input = "c"; Lexer L5 = new LettersLexer(input); try { L5.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "c,a,b"; L5 = new LettersLexer(input); try { L5.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "c,a;b,5;k"; L5 = new LettersLexer(input); try { L5.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "ca,g,h"; L5 = new LettersLexer(input); try { L5.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "a;b,c;d;e,"; L5 = new LettersLexer(input); try { L5.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "e,f,g;h"; L5 = new LettersLexer(input); try { L5.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } // Дополнительное задание 1 System.Console.WriteLine("\nExtra Task 1:"); input = "4"; Lexer LL1 = new DigitsLexer(input); try { LL1.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "4 5 2"; LL1 = new DigitsLexer(input); try { LL1.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "4,5 2"; LL1 = new DigitsLexer(input); try { LL1.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "1 2 3 4 5"; LL1 = new DigitsLexer(input); try { LL1.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "1 2 34 5 6"; LL1 = new DigitsLexer(input); try { LL1.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } // Дополнительное задание 2 System.Console.WriteLine("\nExtra Task 2:"); input = "aa12c23dd1"; Lexer LL2 = new DigitsLettersGroupsLexer(input); try { LL2.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "4"; LL2 = new DigitsLettersGroupsLexer(input); try { LL2.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "4sd35r5d5t03ab"; LL2 = new DigitsLettersGroupsLexer(input); try { LL2.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "ab0k"; LL2 = new DigitsLettersGroupsLexer(input); try { LL2.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "a4bcd5e"; LL2 = new DigitsLettersGroupsLexer(input); try { LL2.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "ab4c,d5e"; LL2 = new DigitsLettersGroupsLexer(input); try { LL2.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } // Дополнительное задание 3 System.Console.WriteLine("\nExtra Task 3:"); input = "1.0"; Lexer LL3 = new DoubleLexer(input); try { LL3.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "4"; LL3 = new DoubleLexer(input); try { LL3.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "55."; LL3 = new DoubleLexer(input); try { LL3.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = ".3"; LL3 = new DoubleLexer(input); try { LL3.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "12.345"; LL3 = new DoubleLexer(input); try { LL3.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } // Дополнительное задание 4 System.Console.WriteLine("\nExtra Task 4:"); input = "a'bcd'"; Lexer LL4 = new StringLexer(input); try { LL4.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "'a'"; LL4 = new StringLexer(input); try { LL4.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "'a'bcd"; LL4 = new StringLexer(input); try { LL4.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "'a123bcd0'"; LL4 = new StringLexer(input); try { LL4.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "'123"; LL4 = new StringLexer(input); try { LL4.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } // Дополнительное задание 5 System.Console.WriteLine("\nExtra Task 5:"); input = "/*12345"; Lexer LL5 = new CommentLexer(input); try { LL5.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "12/*345*/"; LL5 = new CommentLexer(input); try { LL5.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "/*1234*/5"; LL5 = new CommentLexer(input); try { LL5.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "/*12345*/"; LL5 = new CommentLexer(input); try { LL5.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } // Дополнительное сложное задание System.Console.WriteLine("\nHard Extra Task:"); input = "a225"; Lexer LLL = new IDListLexer(input); try { LLL.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "a225.abcd.e00e00.k"; LLL = new IDListLexer(input); try { LLL.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "a225.abcd e00e00.k"; LLL = new IDListLexer(input); try { LLL.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "a225..abcd.e00e00.k"; LLL = new IDListLexer(input); try { LLL.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } }
public static void TestExtra4() { System.Console.WriteLine("\n------------------"); System.Console.WriteLine("\nTests for ExtraTask 4"); string input = "'abc2'"; Lexer L = new StringLexer(input); try { L.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "'a'"; L = new StringLexer(input); try { L.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "''"; L = new StringLexer(input); try { L.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } System.Console.WriteLine("\nThere should be errors:"); input = "'as'fg'"; L = new StringLexer(input); try { L.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "'a"; L = new StringLexer(input); try { L.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "a'"; L = new StringLexer(input); try { L.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = "a"; L = new StringLexer(input); try { L.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } input = ""; L = new StringLexer(input); try { L.Parse(); } catch (LexerException e) { System.Console.WriteLine(e.Message); } }
public static void Main() { System.Console.WriteLine("Testing IntLexer:"); List <string> test_int = new List <string> { "1", "123", "+123", "-123", "+a", "+", "+1233f", " " }; foreach (var str in test_int) { IntLexer L = new IntLexer(str); System.Console.WriteLine(System.String.Format("{0} : {1}", str, L.Parse())); } System.Console.WriteLine("Testing IDLexer:"); List <string> test_id = new List <string> { "a", "a1ad", "a___", "1", "", " " }; foreach (var str in test_id) { IdLexer L = new IdLexer(str); System.Console.WriteLine(System.String.Format("{0} : {1}", str, L.Parse())); } System.Console.WriteLine("Testing NoZeroIntLexer:"); List <string> test_nozeroint = new List <string> { "1", "123", "+123", "-123", "+0", "0", "-0", " " }; foreach (var str in test_nozeroint) { NoZeroIntLexer L = new NoZeroIntLexer(str); System.Console.WriteLine(System.String.Format("{0} : {1}", str, L.Parse())); } System.Console.WriteLine("Testing LetterDigitLexer:"); List <string> test_LetterDigitLexer = new List <string> { "a", "a1", "a1a", "1", "a11", "a1aa", "", " " }; foreach (var str in test_LetterDigitLexer) { LetterDigitLexer L = new LetterDigitLexer(str); System.Console.WriteLine(System.String.Format("{0} : {1}", str, L.Parse())); } System.Console.WriteLine("Testing ListLexer:"); List <string> test_ListLexer = new List <string> { "a", "a,", "a;b", "a,b;", "ab", "", ",", " " }; foreach (var str in test_ListLexer) { ListLexer L = new ListLexer(str); System.Console.WriteLine(System.String.Format("{0} : {1} : {2}", str, L.Parse(), string.Join(",", L.chrs))); } System.Console.WriteLine("Testing DigitListLexer:"); List <string> test_DigitListLexer = new List <string> { "1", " 1 2 3", " ", "", "1 2 3 b" }; foreach (var str in test_DigitListLexer) { DigitListLexer L = new DigitListLexer(str); System.Console.WriteLine(System.String.Format("{0} : {1} : {2}", str, L.Parse(), string.Join(",", L.ints))); } System.Console.WriteLine("Testing GroupLexer:"); List <string> test_GroupLexer = new List <string> { "aa12c23dd1", "aaa12c23dd1", "aa12c232dd1", " ", "" }; foreach (var str in test_GroupLexer) { GroupLexer L = new GroupLexer(str); System.Console.WriteLine(System.String.Format("{0} : {1} : {2}", str, L.Parse(), L.result)); } System.Console.WriteLine("Testing RealLexer:"); List <string> test_RealLexer = new List <string> { "+12", "12", "+0.1", "123.b", " ", "" }; foreach (var str in test_RealLexer) { RealLexer L = new RealLexer(str); System.Console.WriteLine(System.String.Format("{0} : {1}", str, L.Parse())); } System.Console.WriteLine("Testing StringLexer:"); List <string> test_StringLexer = new List <string> { "'asd'", "''", "a", "'aaa'a", "'aaa", " ", "" }; foreach (var str in test_StringLexer) { StringLexer L = new StringLexer(str); System.Console.WriteLine(System.String.Format("{0} : {1}", str, L.Parse())); } System.Console.WriteLine("Testing CommentLexer:"); List <string> test_CommentLexer = new List <string> { "/*ddd*/", "/**/", "/*fff", " ", "" }; foreach (var str in test_CommentLexer) { CommentLexer L = new CommentLexer(str); System.Console.WriteLine(System.String.Format("{0} : {1}", str, L.Parse())); } }