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