在BNF和EBNF表示法中是否允许使用正则表达式



例如,如果我想定义Lisp编程语言,其中名称甚至可以包括非字母数字字符,我是否应该用以下符号列出所有可用的字符:

validchar ::= "a" | "b" | "c" ... "-" | "*" | "$" ... ;
name = validchar, (validchar | digit)+;

或者我可以使用regexs,比如:

validchar ::= "[^(^)^s^d]";
name ::= validchar, (validchar | digit)*;

甚至:

name ::= "[^(^)^s^d]", "[^(^)^s]"*;

这会大大缩短它,甚至会包括韩元、日元、欧元等字符,我无法列出这些字符,但它们实际上是可用的。

是否允许这样做取决于您使用的实现(E)BNF表示法的工具。

一些工具相当严格,并坚持(E)BNF的原始定义,最多允许在语言标记上使用Kleene*或+。另外一点是,不要求经典(E)BNF将字符作为终端进行操作。

显然,能够直接用字符定义一些语言标记是很方便的,并且可以想象(正如您所拥有的)EBNF,在其中,不仅可以将字符写成终端,还可以将正则表达式写在字符上。

您建议使用的工具是否允许。。。完全取决于工具。许多处理(E)BNF的工具,如YACC,实际上被设计为与另一种工具协同工作,即定义令牌字符序列的"lexer生成器"(对于YACC,这被称为FLEX)。有了这样的工具对,(E)BNF工具通常不允许在它们上面提及任何字符或正则表达式,但lexer生成器工具明确允许标记的字符和正则表达式规范。

有数百个(E)BNF和lexer生成器工具,每个工具都有一些(极其不同的)规则。查看工具文档。

或者按照你想要的方式编写,并构建你自己的(第101个)工具。

最新更新