我正在使用Sprache monadic解析器来解析DSL。
这是我的语法片段:
public static readonly Parser<IExpression> TerminatedStatement =
from exp in Parse.Ref(() => Expression)
from _ in Parse.Char(';').Token()
select exp;
public static readonly Parser<IExpression> Statement =
Parse.Ref(() => TerminatedStatement)
.Or(Parse.Ref(() => InvocationStatement));
public static readonly Parser<Statements> Statements =
from statements in Statement.Many()
select new Statements(statements);
如果我随后使用Statements.Parse(" ")
我会得到一个异常,说输入意外结束。
如果Statements
使用Many
运算符,AFAIK会产生0-n结果,那怎么可能呢?
" "
应返回包含0个语句的Statements
实例。
那么解析器如何抱怨输入意外结束?难道它只是得出结论,那里没有陈述? (无论构成陈述的不同表达形式是什么时髦的东西)