2016-07-31 67 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)工具。

相關問題