0

趣味でカスタム プログラミング言語を作成しようとしていますが、関数呼び出しでサポートしたい構文に少し夢中になっています。

uses ConsoleIO

r(int)success start (int) nArgument
    printHelloWorlds
    return 0

printHelloWorld 
    print "Hello world\n"

printHelloWorlds
    getNumberFrom 4 into timesToPrint
    timesPrinted = 0
    printHelloWorld
    timesPrinted = timesPrinted + 1
    if timesPrinted < timesToPrint
        goToLine 17

getNumberFrom (int)number into o(int) out
    name = "John"
    out = 3 + name.findFirstOccurenceOf 'o' + number

r(int) (string)str .findFirstOccurenceOf (char)c
    //later
    return 3

うまくいけば、私がやろうとしていることの基本的なアイデアを得ることができます. もう少し詳しく言うと、

  • r を変数の前に置くと、戻り値になります
  • 変数は参照されるだけで「宣言」されます
  • 関数名には、連続する 2 つの「名前トークン」を含めることはできません。各名前トークンの間に少なくとも 1 つの引数が必要です (また、複数の変数の場合、それらの間にコンマが必要になる可能性があります。その制限)
  • 変数の前に o を置くと、それは「出力」値になります。この場合、関数は読み取る前に書き込む必要があり、関数が呼び出される前に変数が存在する必要はありません (「getNumberFrom 4 into timesToPrint」では、getNumberFrom (int) into o( int) が呼び出されます

私はすでにレクサーを次のようにプログラムしました:

  • 関数宣言の解釈、スコープの処理、リテラルの処理など
  • コードの通常の行を読み取り、各トークンのリストと、名前に各トークンを含むすべての関数のリスト (存在する場合) を作成し、トークンが変数の名前であるかどうかを認識します
  • 私はまだフロー制御 (if/goto) を扱っていません。現在、それらは通常の関数と同じように扱われています。

ただし、各行が呼び出している関数、順序、入力、および出力 (o 変数) を実際に把握する必要があり、ちょっとした障害にぶつかりました。 . これについては経験がなく、どこから始めればよいかわかりません。ある種の再帰関数が必要になることはわかっています。

基本的に、私が探しているアルゴリズムのタイプを誰か教えてもらえますか、それとももっと学ぶためにグーグルを始めるための流行語を教えてもらえますか? bison や antlr などを使用する必要がありますか、それともこの柔軟で奇妙な言語は複雑になりすぎますか?

注: 私は Bison や Flex などを使用していません。すべてのコードを自分で C++ で書いています。

4

1 に答える 1

1

複雑なプログラミング言語を構築している場合は、bisonまたはANTLRのようなパーサジェネレータを使用して解析を行うことを強く検討する必要があります。このようなツールの利点は、言語のルールが何であるか、およびそのようなルールが見つかったときに何をするかを記述できることです。ツールは自動的に解析コードを生成します。

bisonLRファミリのボトムアップパーサーをサポートします:LALR(1)、LR(1)、GLR(1)、および新しいIELR(1)アルゴリズム。これらは言語の大規模なファミリーをキャプチャしますが、発生する可能性のあるエラーの一部を修正するために、解析アルゴリズムについて少し知っておく必要があります(つまり、shift/reduceおよびreduce/reduce)。

ANTLRはLL(*)パーサーを使用します。これは、わずかに少ない言語セットをキャプチャしますが、多くのプログラミング言語で美しく機能する傾向があります。

あなたの質問に対する正しい答えはありません。私はあなたがより快適に感じ、適切な言語出力を持っているどんなツールでも使うでしょう。

独自のパーサーをローリングすることを主張する場合は、実際に上記のアルゴリズムを手動で実装できますが、それは非常に困難です。最も簡単なオプションは、バックトラック付きのトップダウン再帰下降パーサーを使用するか、LL(1)になるまで文法を揺らしてから、単純なトップダウンの非バックトラックパーサーを使用することです。そうは言っても、あなたは物事を必要以上に難しくしていると思います。

お役に立てれば!

于 2012-06-14T20:45:09.367 に答える