9

トランスパイラの仕組みを理解したい。これを行う最善の方法は、ofcourse を作成することです。

これが理論的にどのように機能するかを理解するために、いくつかのリソースを調べてきました。そして、私は次のことを理解しています:

私が理解していることから、基本的に2つのクラスを書く必要があります:

  1. 字句解析器
  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それとも、この仕事のためにアナライザーを書くのは間違っていますか?

編集

したがって、レクサー/パーサーがどのように機能するかという私の考えは、明らかに正しくありません。このプロセスがどのように機能するかに関する「疑似」情報 (疑似例を含む) は大歓迎です。

4

2 に答える 2

0

あなたはすでにいくつかの実験を行っています。ANTLRを選ぶことをお勧めします。指定した両方の言語の文法は、ANTLR v4 の Github リポジトリに存在します。次のステップは、両方の Grammar をマップすることです。変数から変数、関数から関数など... すべての言語構成体を意味します: キーワード、シンボルなど。追加の機能はハードコードする必要があります。そうしないと、変換、コンパイル、または解釈が 100% 機能しません。

于 2019-11-05T12:59:34.033 に答える