我认为我可能遇到的是悬空的 else 问题,但我不确定。我负责编写的语言需要支持多行 if 语句以及单行 ie
if(conditions){
print "multi";
print "line";
}
和
if(conditions)
print "single line"
用我的语言对应
if conditions then begin
end
和
if conditions then
我还需要添加对 else-if 和 else's 的支持,两者都使用与上述相同的语法以及 begin's 和 end's。我花了一段时间试图让它工作并且我已经接近了,但是我现在使用的语法我得到了“这个输入有多个有效的解释......”错误。这是我正在使用的 MGrammar 代码:
syntax sIf = tIf conditions:Common.List(sBooleanExpression) tThen sBegin statements:sStatements2 (tEnd | tEnd2) next:Common.List(sElseIf)?
=> If{Conditions{conditions}, Body{statements}, Next{next}}
| tIf conditions:Common.List(sBooleanExpression) tThen statement:sSingleStatement next:Common.List(sElseIf)?
=> SingleIf{Conditions{conditions}, Body{statement}, Next{next}}
;
syntax sElseIf = tElseIf conditions:Common.List(sBooleanExpression) tThen sBegin statements:sStatements2 (tEnd | tEnd2) next:Common.List(sElseIf)?
=> ElseIf{Conditions{conditions}, Body{statements}, Next{next}}
| tElseIf conditions:Common.List(sBooleanExpression) tThen statement:sSingleStatement next:Common.List(sElseIf)?
=> ElseIf{Conditions{conditions}, Body{statement}, Next{next}}
| e:sElse => e;
syntax sElse = tElse tThen sBegin es:sStatements2 (tEnd | tEnd2) => Else{Body{es}}
| tElse statement:sSingleStatement => Else{Body{statement}}
;
这可能是第 10 个版本,因为我尝试了各种方法来使 if/else if/else 结构正常工作。
基本上,我的 Main 得到一个 StatementList,sIf 就是其中之一。sIf 尝试查找多行或单行 if 语句,后跟可选的 sElseIf(您不必有 else)。
我认为问题在于正则表达式编译器可能将 else if 视为 sElse 后跟 sIf 语句,而不是 sElseIf 语句。在预览模式下,它实际上完全按照我想要的方式绘制了树,所以如果有办法在我的 C# 应用程序中解析它时忽略此消息,那么我猜这也可以。