我正在使用Sprache構建一個簡單的命令式語法。我試圖找出是否有一種方法可以在缺少關閉字符(例如,),})時獲得更好的錯誤報告。如何改進Sprache解析器錯誤消息與丟失的左大括號?
如果缺少結尾字符,我的語法會正確報告錯誤。但是,消息傳遞導致難以理解真正的問題。考慮下面的字符串被解析:
sum 10 [multiply 5 4
SPRACHE報告以下錯誤:
Sprache.ParseException : Parsing failure: unexpected '['; expected newline or end of input (Line 1, Column 8); recently consumed: sum 10
這似乎是發生的是,解析器嘗試匹配我的CommandSubstitution
並不能找到一個關閉']'
。這會導致解析器回退並嘗試備用。由於該命令不能再匹配Things
,因此它會嘗試匹配CommandTerminator
。因爲它無法匹配'['
,因此它會報告抱怨預期的newline
或end of input
的錯誤,而不是說「嘿,夥計,您的支架不匹配!」
是否有任何解決方法或建議如何改進語法以使報告更好地使用像Sprache這樣的解析庫?
public static readonly Parser<Word> Word = Parse.Char(IsWordChar, "word character").AtLeastOnce().Text()
.Select(str => new Word(str));
public static readonly Parser<CommandSubstitution> CommandSubstitution = from open in Parse.Char('[').Once()
from body in Parse.Ref(() => Things)
from close in Parse.Char(']').Once()
select new CommandSubstitution(body.ToList());
public static readonly Parser<Thing> Thing = CommandSubstitution.Or<Thing>(Word);
public static readonly Parser<IEnumerable<Thing>> Things = (from ignoreBefore in WordSeparator.Optional()
from thing in Thing
from ignoreAfter in WordSeparator.Optional()
select thing).Many();
public static readonly Parser<IEnumerable<Thing>> Command = from things in Things
from terminator in CommandTerminator
select things;