我的任务是解析(和转换)一种计算机语言的代码,它的规则有点奇怪,至少我是这样看的。准确地说,编译器将新行(以及分号)视为语句分隔符,但除此之外(例如在语句内部),它会将它们视为间隔符(空格)。
例如,这段代码:
try
local x = 5 / 0
catch (i)
print(i + "\n")
证明等价于:
try local x = 5 / 0 catch (i) print(i + "\n")
我不知道如何在 EBNF 中,或者特别是在 Lark EBNF 方言中表达这样的规则。我的意思是一种明智的方式。我可能可以在所有语句中定义所有可能的换行位置,但这会很麻烦且容易出错。
我希望找到一种根据上下文处理换行符的方法。有没有一种经过验证的方法,最好是在 Python/Lark 域中?如果我必须为此修改解析器,那么我应该从哪里开始呢?
或者,如果我特别误解了这种语言或机器语言解析中的某些内容,或者我对问题的陈述是错误的,我也很乐意接受教育。
(正如您可能猜到的那样,所讨论的语言具有经过充分验证的实现,但没有正式定义的语法。此外,它是 Squirrel,尽管它很重要。)