1

我认为我可能遇到的是悬空的 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# 应用程序中解析它时忽略此消息,那么我猜这也可以。

4

0 回答 0