2016-07-31 137 views
2

如果我想为例子来定义的Lisp编程语言,其中名称可以包含即使非字母数字字符,我要列出所有像一个符号可用字符:BNF和EBNF符号是否允许使用正则表达式?

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

还是我允许使用regexs,如:

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

甚至:

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

这会缩短很多,而且它将包括连字符如₩,¥,€等等,我不能列出但实际上可用。

回答

3

是否允许这取决于您正在使用的实现(E)BNF符号的工具。

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

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

您建议使用的工具是否允许......完全取决于该工具。许多用于处理(E)BNF的工具,例如YACC,实际上是设计成与另一个工具联合工作的,即一个“词法分析器生成器”(用于YACC,这称为FLEX),它定义了用于标记的字符序列。使用这样的工具对,(E)BNF工具通常不允许提及任何字符或正则表达式,但词法分析生成器工具明确允许用于标记的字符和正则表达式规范。

有数百个(E)BNF和词法分析生成器工具,每个工具都有一些(非常不同的)规则。检查工具文档。

或按照自己想写的方式写下来,然后构建自己的(101st)工具。