トランスパイラの仕組みを理解したい。これを行う最善の方法は、ofcourse を作成することです。
これが理論的にどのように機能するかを理解するために、いくつかのリソースを調べてきました。そして、私は次のことを理解しています:
私が理解していることから、基本的に2つのクラスを書く必要があります:
- 字句解析器
- パーサー
字句解析器
はLexical Analyzer
、ファイルのソース コードを入力 (入力ストリーム) として受け取ります。たとえば、次のコード:
if (someVar == 20) {
MessageBox("Hello World!");
}
次に、Lexical Analyzer
これからデータのチャンクを作成します。
[if]
[ ]
[(]
[someVar]
[ ]
[==]
[ ]
[20]
[)]
[ ]
[{]
[\n]
[\t]
[MessageBox]
[(]
["]
[Hello World!]
["]
[)]
[;]
[\n]
[\t]
[}]
その後、クラスに送信されParser
ます。
パーサー
次に、Parser
クラスはトークン (?) のすべてのチャンクを読み取り、各トークン (?) の意味を指定します。特定のタイプを割り当てます。したがって、上記の文字列の結果は次のように識別されます。
[if] // Keyword
[ ] // Whitespace
[(] // L_Parenthesis
[someVar] // Identifier
[ ] // Whitespace
[==] // Operator
[ ] // Whitespace
[20] // Number (or Integer)
[)] // R_Parenthesis
[ ] // Whitespace
[{] // L_Bracket
[\n] // Whitespace
[\t] // Whitespace
[MessageBox] // Keyword
[(] // L_Parenthesis
["] // Not yet sure where this would go
[Hello World!] // Same..
["] // Same...
[)] // R_Parenthesis
[;] // Semicolon
[\n] // Whitespace
[\t] // Whitespace
[}] // R_Bracket
ご覧のとおり、どの型がどこにあるのかを完全には整理していません。しかし、これは基本的な考え方であるべきです。
次にやりたいことは、そのソース コードを別のソース コードに変換してトランスパイルすることです。しかし、それはどのように機能しますか?直接のチュートリアル、それに関する説明が見つかりません。
次のカスタムコードがあるとします。
def myVar = true;
public function myFunc ( def arg1 )
{
if ( arg1 == true ) {
MessageBox("My Message");
}
}
次に、字句プロセスがこのコードを解析します。次に、それをJavascriptのようなものに変換するにはどうすればよいですか?
var myVar = true;
myFunc = function ( arg1 )
{
if ( arg1 == true ) {
alert("My Message");
}
}
カスタム CDOE から Javascript のようなコードへのマッピングはどのように機能しますか? 同様に、関数宣言。私のLexical
パーサーには次のものがあります: public
, function
, myFunc
. それを次のようにマッピングする必要があることをどのように知ることができmyFunc = function
ますか? ...?
これをどのように行うべきかについての良い実用的な情報はありtranspiler
ますか?lexical
それとも、この仕事のためにアナライザーを書くのは間違っていますか?
編集
したがって、レクサー/パーサーがどのように機能するかという私の考えは、明らかに正しくありません。このプロセスがどのように機能するかに関する「疑似」情報 (疑似例を含む) は大歓迎です。