3

我正在使用 SMIE 来解析一种并不总是需要;终止语句的语言。如果行尾位于大括号构造 ( {}, (), []) 之外,并且最后一个非注释标记不是运算符,则\n充当语句终止符。否则,如果行尾在大括号结构内或最后一个标记是运算符,则\n充当延续。

例如,

variable := 172 + 92; 

variable := 172 + 92

variable :=
    172 + 92;

variable :=
    172 + 92

variable := (172 +
    92)

都是有效的陈述。但,

variable 
    := 172 + 92

不是。

我如何编码这是 SMIE 的 BNF 语法(或初学者的任何 BNF)?或者,这不可能吗?

我了解如何将其放入词法分析器并;酌情添加标记,但如果可能的话,我宁愿将其放入语法中。

4

1 回答 1

3

不,您不能在 BNF 中对其进行编码(因为 SMIE 只接受无法表达的非常弱的 BNF)。看看我在 Octave 模式下是如何做到的:当分词器";"遇到\n大括号/括号/括号之外的 a 时,它会返回(您可以使用 进行检查(zerop (car (syntax-ppss))))。

于 2013-03-13T18:15:06.077 回答