我正在写一个 DSL,同时也在学习 parboiled2。构建 AST 后,我想运行一些语义检查,如果有任何错误,输出引用源文本中违规位置的错误消息。
我正在写如下内容,到目前为止,这些内容确实有效:
case class CtxElem[A](start:Int, end:Int, elem:A)
def Identifier = rule {
push(cursor) ~
capture(Alpha ~ zeroOrMore(AlphaNum)) ~
push(cursor) ~
WhiteSpace
~> ((start, identifier, finish) => CtxElem(start, finish, identifier))
}
有没有更好或更简单的方法?