1

基本的に次のように機能する CSS っぽい (CSS + カスタム拡張) に基づいてカスタム言語を設計しています。

[object.member.value = 5]{
object.member.anothervalue:8 
object.member.yetanothervalue:'hello'
object.member.yetyetanothervalue.anothervalue:blue
}

基本的に、この言語ではいくつかの条件 (if はネスト可能) をチェックしてから、いくつかの値をオブジェクトに適用できます。ループはありません。これはプレーン テキスト ファイルに保存され、開始時にアプリケーション (C++) に読み込まれます。

アイデアは、この CSS っぽいファイルを C++ ツリーなどに変換し、実行時に評価できるようにすることです。

いくつかの語彙アナライザーとトークナイザー (Yacc、Flex、Bison など) の使用を検討しています。

使用するツール/ライブラリの提案は何ですか?

4

3 に答える 3

1

これは非常に単純な解析タスクであり、パーサージェネレーターを使用すると、パーサーを自分で作成するのと同じかそれ以上の時間がかかるため、再帰降下パーサーを備えた自家製スキャナーを使用します。

于 2014-09-01T11:38:37.470 に答える
1

字句解析器 (Boost.Lex) とパーサー (Boost.Qi) を簡単に作成できるBoost Spiritをご覧ください。個別の文法ファイルを使用する代わりに、C++ コードで直接構文/文法を定義するという興味深いアプローチがあります。ポータブルで、標準的で、自己完結型で、非常にエレガントです。

言語がより複雑なものに進化する場合は、Flex と Bisonを考慮することができます。それらは、古い Unix の同等物である Lex & Yacc と同じ種類の入力ファイルを使用します。これらのツールの利点は、文献が豊富にあることです。不便なのは、スケルトン コードと、文法ファイルで与えられた断片を組み合わせてコードを生成することです。したがって、マスターして維持するのはより複雑です。

しかし、あなたの特別なケースでは、トークンが2つしかない非常に単純な言語と、明らかに単純な「LL(1)文法」があります。(たとえば、パーサーは、何を解析するかをあいまいさなく決定するために、単一のトークンを先に読み取る必要があります)。独自のコードを作成するのは簡単で、最終的<regex>にトークンのスキャンを容易にするために使用し、言語構造に対応するオブジェクトを作成します。

于 2014-09-01T20:44:49.450 に答える