晴耕雨読

working in the fields on fine days and reading books on rainy days

[C#] 構文解析器Spracheで1文字を読み取る

構文解析器の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"));

以上です。

参考資料