如果我想要定义Lisp编程语言,其名称甚至可以包含非字母数字字符,我应该列出所有可用的字符,其符号如下:
validchar ::= "a" | "b" | "c" ... "-" | "*" | "$" ... ;
name = validchar, (validchar | digit)+;
或者我可以使用正则表达式,例如:
validchar ::= "[^(^)^\s^\d]";
name ::= validchar, (validchar | digit)*;
甚至:
name ::= "[^(^)^\s^\d]", "[^(^)^\s]"*;
这会缩短很多,甚至包括₩,¥,€等字符,我不能列出但实际上可用。
答案 0 :(得分:3)
是否允许这取决于您使用的实现(E)BNF表示法的工具。
有些工具相当严格,坚持(E)BNF的原始定义,最多允许使用Kleene *或+语言令牌。另外一点是,不要求经典(E)BNF对字符作为终端进行操作。
显然,能够直接根据字符定义一些语言标记是很方便的,人们可以想象(如你所知)一个EBNF,其中不仅可以将字符写为终端,还可以写入字符的正则表达式。 / p>
您建议使用的工具是否允许......完全取决于工具。处理(E)BNF的许多工具(例如YACC)实际上被设计为与另一工具一起工作,“词法生成器”(用于YACC,这称为FLEX)定义令牌的字符序列。使用这样的工具对,(E)BNF工具通常不允许任何提及它们的字符或正则表达式,但词法分析器生成器工具明确允许令牌的字符和正则表达式规范。
有数百个(E)BNF和词法生成器工具,每个工具都有一些(极其不同的)规则。检查工具文档。
或者按照您想要的方式编写它,并构建您自己的(第101个)工具。