我正在使用 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 结果。
" "
应该返回一个Statements
包含 0 个语句的实例。
那么解析器如何抱怨输入意外结束呢?它不应该只是断定那里没有任何陈述吗?(无论构成语句的不同表达方式有什么时髦的东西)