expression IS NULL
SQL に似た言語のパーサーを開発していますが、次のような言語のルールをいくつか作成するという問題がありますexpression IN (expression1, expression2, ...)
。
GitHub テスト プロジェクトhttps://github.com/anpv/SpracheTest/をアップロードしましたが、このバリアントは良くありません。
次のルールを使用しようとしました。
private static readonly Parser<AstNode> InOperator =
from expr in Parse.Ref(() => Expression)
from inKeyword in Parse.IgnoreCase("in").Token()
from values in Parse
.Ref(() => Expression)
.DelimitedBy(Comma)
.Contained(OpenParenthesis, CloseParenthesis)
select new InOperator(expr, values);
private static readonly Parser<AstNode> IsNullOperator =
from expr in Parse.Ref(() => Expression)
from isNullKeyword in Parse
.IgnoreCase("is")
.Then(_ => Parse.WhiteSpace.AtLeastOnce())
.Then(_ => Parse.IgnoreCase("null"))
select new IsNullOperator(expr);
private static readonly Parser<AstNode> Equality =
Parse
.ChainOperator(Eq, IsNullOperator.Or(InOperator).Or(Additive), MakeBinary);
またはParseException
のようなコードをスローします。ScriptParser.ParseExpression("1 is null")
ScriptParser.ParseExpression("1 in (1, 2, 3)"): "Parsing failure: Left recursion in the grammar."
Expression を先読みするにはどうすればよいですか、またはこの問題を解決するための他のバリアントは存在しますか?