いくつか検索しましたが、この質問に「直接」答える質問は見つかりませんでした。
とにかく、この質問の基本的な要点は、言語をパーサーや構文の強調表示などを構築するための大きな苦痛にする「言語機能」または「構文」とは何か疑問に思っていることです。
これは主観的なことかもしれませんが、たとえば、すべてのテンプレートやブラケットなどを備えたC ++のようなものとは対照的に、たとえばLispのような言語をその(func parmsなど)構造で解析することの違いを考えていました。 。
いくつか検索しましたが、この質問に「直接」答える質問は見つかりませんでした。
とにかく、この質問の基本的な要点は、言語をパーサーや構文の強調表示などを構築するための大きな苦痛にする「言語機能」または「構文」とは何か疑問に思っていることです。
これは主観的なことかもしれませんが、たとえば、すべてのテンプレートやブラケットなどを備えたC ++のようなものとは対照的に、たとえばLispのような言語をその(func parmsなど)構造で解析することの違いを考えていました。 。
マクロまたはその他の手段による構文拡張をサポートする言語は、マクロを適切に拡張できない限り、完全に解析することはできません。LispやCurlなどの完全な手続き型マクロを備えた言語の場合、言語自体を実装せずに完全に解析することはできません。
通常、このような言語の構文を強調する目的で、マクロを拡張しようとせず、マクロが従来の言語イディオムに従っていると想定します。
正式な言語と文法の観点から、私見には2つの主要な側面があります。まず第一に、あなたの言語の文法は、簡単に処理できるカテゴリに属している必要があります。たとえば、文脈自由文法を使用する言語。これは、たとえば、言語に要素が多すぎて、その数が互いに依存していることを意味します。たとえば、開き角かっこや閉じ角かっこなど、解析するには無限のメモリが必要になる場合があります。C ++には状況依存の文法がありますが、これはさらに悪いことです。たとえば、相互に依存する量を持つ3つの要素を持つ文法があります。もう1つの側面は、構文解析中のあいまいさについてです。あいまいな文法では、同じテキストをさまざまな方法で解析できます。つまり、解析アルゴリズムの正しい方法を見つける必要があります。ほとんどの場合、あいまいさはまったくありません。
完全にはわかりませんが、角かっこと空白(合理的に定義されている場合)の解析も同様に複雑です。どちらの場合も、ブロックのネストのレベルを確認するためのカウンターが必要ですが、空白を使用すると、ローカルでレベルを識別でき(空白を数えることで)、カウンターがゼロを下回らないことを確認できます。これは、次の場合に発生する可能性があります。開くよりも閉じるブラケットが多い。