構文解析器のSpracheで1文字を読み取るためのメソッド一覧について説明します。
Char()
任意の1文字を読み取ります。
Parser<char> Char(char c)
Parser<char> Char(Predicate<char> predicate, string description)
Parser<char> multiply = Parse.Char('*');
Assert.Equal('*', multiply.Parse("*"));
Parser<char> punctuation = Parse.Char(char.IsPunctuation, "punctuation");
Assert.Equal(',', punctuation.Parse(","));
Chars()
任意の1文字を読み取ります。読み取る対象の複数の文字一覧を指定することができます。
Parser<char> Chars(params char[] c)
Parser<char> Chars(string c)
Parser<char> op = Parse.Chars('+', '-', '*', '/');
Assert.Equal('-', op.Parse("-"));
Assert.Equal('*', op.Parse("*"));
Parser<char> parens = Parse.Chars("()");
Assert.Equal(')', parens.Parse(")"));
CharExcept()
任意の1文字を読み取ります。ただし、引数に指定した文字以外のみを読み取ります。
Parser<char> CharExcept(char c)
Parser<char> CharExcept(IEnumerable<char> c)
Parser<char> CharExcept(string c)
Parser<char> CharExcept(Predicate<char> predicate, string description)
Parser<char> parser1 = Parse.CharExcept('"');
Assert.Equal('a', parser1.Parse("a"));
Assert.Throws<ParseException>(() => parser1.Parse("\""));
Parser<char> parser2 = Parse.CharExcept(['1', '2', '3']);
Assert.Equal('4', parser2.Parse("4"));
Assert.Throws<ParseException>(() => parser2.Parse("2"));
Parser<char> parser3 = Parse.CharExcept("123");
Assert.Equal('4', parser3.Parse("4"));
Assert.Throws<ParseException>(() => parser3.Parse("2"));
Parser<char> parser4 = Parse.CharExcept(char.IsPunctuation, "punctuation");
Assert.Equal('a', parser4.Parse("a"));
Assert.Throws<ParseException>(() => parser4.Parse("."));
IgnoreCase()
引数の文字を大文字小文字を無視して読み取ります。
Parser<char> IgnoreCase(char c)
Parser<IEnumerable<char>> IgnoreCase(string s)
Parser<char> parser = Parse.IgnoreCase('a');
Assert.Equal('A', parser.Parse("A"));
Parser<IEnumerable<char>> parserString = Parse.IgnoreCase("test");
Assert.Equal(['T','e','s','T'], parserString.Parse("TesT"));
WhiteSpace
char.IsWhiteSpace() にマッチする空白や改行を読み取ります。
Parser<char> WhiteSpace = Char(char.IsWhiteSpace, "whitespace")
Assert.Equal(' ', Parse.WhiteSpace.Parse(" "));
Assert.Equal('\t', Parse.WhiteSpace.Parse("\t"));
Assert.Throws<ParseException>(() => Parse.WhiteSpace.Parse(""));
Digit
char.IsDigit() にマッチする数字を読み取ります。
Parser<char> Digit = Char(char.IsDigit, "digit")
Assert.Equal('7', Parse.Digit.Parse("7"));
Numeric
char.IsNumber() にマッチする数値を読み取ります。char.IsDigit よりも多くの数字とマッチします。 例えば、べき乗の「²」と「³」や、分数の「¼」と「½」などにもマッチします。
Parser<char> Numeric = Char(char.IsNumber, "numeric character")
Assert.Equal('1', Parse.Numeric.Parse("1"));
Assert.Equal('¼', Parse.Numeric.Parse("¼"));
Letter
char.IsLetter() にマッチするアルファベットなどの文字を読み取ります。
Parser<char> Letter = Char(char.IsLetter, "letter")
Assert.Equal('a', Parse.Letter.Parse("a"));
Assert.Throws<ParseException>(() => Parse.Lower.Parse("1"));
Assert.Throws<ParseException>(() => Parse.Lower.Parse("あ"));
LetterOrDigit
char.IsLetter() にマッチする文字、または char.IsDigit() にマッチする数字を読み取ります。
LetterOrDigit = Char(char.IsLetterOrDigit, "letter or digit")
Assert.Equal('a', Parse.LetterOrDigit.Parse("a"));
Assert.Equal('4', Parse.LetterOrDigit.Parse("4"));
Lower
アルファベットの小文字を読み取ります。
Parser<char> Lower = Char(char.IsLower, "lowercase letter")
Assert.Equal('a', Parse.Lower.Parse("a"));
// unexpected '4'; expected lowercase letter
Assert.Throws<ParseException>(() => Parse.Lower.Parse("4"));
Upper
アルファベットの大文字を読み取ります。
Parser<char> Upper = Char(char.IsUpper, "uppercase letter")
Assert.Equal('A', Parse.Upper.Parse("A"));
Assert.Throws<ParseException>(() => Parse.Upper.Parse("a"));
AnyChar
全ての文字とマッチし、その1文字を読み取ります。
Parser<char> AnyChar = Char(c => true, "any character")
Assert.Equal('a', Parse.AnyChar.Parse("abcd"));
以上です。
参考資料
- sprache/Sprache: A tiny, friendly, C# parser construction library
- Sprache Part 1: Parsing Characters - Justin Pealing
- Char()
- Chars()
- CharExcept()
- IgnoreCase()
- WhiteSpace
- Digit
- Numeric
- Letter
- LetterOrDigit
- Lower
- Upper
- AnyChar