2016-07-31 2 views
2

私は名前も英数字以外の文字を含めることができLispのプログラミング言語を定義するために例えばたかった場合、私のような記法で使用可能なすべての文字表示されるはずです:正規表現はBNFとEBNF表記で許可されていますか?

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

をそれとも私が使用させていただいております

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

あるいは::のようなregexs、

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

これはそれをたくさん短くなり、そしてそれも文字が含まれます私がリストアップすることはできませんが、実際に使用できる、¥、¥、€などのように。

答えて

3

これが許可されるかどうかは、(E)BNF表記を実装する使用しているツールによって異なります。

一部のツールは、(E)BNFの元の定義に厳密に従っているため、最高のKleene *または+言語トークンを可能にします。さらに、古典的な(E)BNFが文字として端末として動作する必要はないという点があります。

文字の観点から直接いくつかの言語トークンを定義できることは明らかであり、端末としての文字だけでなく文字の正規表現も書くことができるEBNFを想像することができます。

あなたが使用を提案するツールが許可するかどうかは、ツールに完全に依存します。 YACCのような(E)BNFを処理する多くのツールは、トークンの文字列を定義する別のツールである「レクサージェネレータ」(YACCの場合はFLEXと呼ばれます)と連携して機能するように実際に設計されています。このようなツール・ペアでは、(E)BNFツールは通常、文字や正規表現を使用することはできませんが、レクサー・ジェネレータ・ツールはトークンの文字と正規表現の仕様を明示的に許可します。

(E)BNFおよびレクサージェネレータツールがあり、それぞれには多少(まったく異なる)ルールがあります。ツールのドキュメントを確認してください。

あなたが書いたやり方で書いて、独自の(101st)ツールを作成してください。

関連する問題