我正在使用SMIE来解析一种并不总是需要;
来终止语句的语言。
如果一行的结尾位于大括号构造之外({}
,()
,[]
)并且最后一个非注释标记不是运算符,那么\n
充当声明终结者。否则,如果行的末尾在大括号构造内,或者最后一个标记是运算符,则\n
将作为延续。
例如,
variable := 172 + 92;
variable := 172 + 92
variable :=
172 + 92;
variable :=
172 + 92
variable := (172 +
92)
都是有效的陈述。但是,
variable
:= 172 + 92
不是。
我如何编码这是SMIE的BNF语法(或任何BNF的初学者)?或者,这是不可能的吗?
我理解如何将它放入词法分析器并根据需要添加;
标记,但如果可能的话,我宁愿把它放入语法中。
答案 0 :(得分:3)
不,你不能在BNF中对它进行编码(因为SMIE只接受非常弱的BNF,而这些BNF无法表达)。看看我是如何为Octave模式做的:当tokenizer遇到";"
时,它会返回\n
,这个(zerop (car (syntax-ppss)))
位于大括号/括号/ paren之外(你可以用{{1}查看})。