使用Emac的SMIE解析语言与可选;声明终止

时间:2013-03-13 14:27:14

标签: elisp bnf smie

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

例如,

variable := 172 + 92; 

variable := 172 + 92

variable :=
    172 + 92;

variable :=
    172 + 92

variable := (172 +
    92)

都是有效的陈述。但是,

variable 
    := 172 + 92

不是。

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

我理解如何将它放入词法分析器并根据需要添加;标记,但如果可能的话,我宁愿把它放入语法中。

1 个答案:

答案 0 :(得分:3)

不,你不能在BNF中对它进行编码(因为SMIE只接受非常弱的BNF,而这些BNF无法表达)。看看我是如何为Octave模式做的:当tokenizer遇到";"时,它会返回\n,这个(zerop (car (syntax-ppss)))位于大括号/括号/ paren之外(你可以用{{1}查看})。