3年生にはコンパイル原理と呼ばれるコースがあり、簡単なコンパイラを自分で書く必要があります。もちろん、私はjsを使用しますが、とてもエレガントではありません。私はそれを使用します。これは言語とは関係ありません。単に私が js を使用するのが好きで、js の機能があまり使用されていないだけです。
さらに、コードの書き方が少し悪いので、文句を言わないでください。
最初に私のプロセス全体について説明しましょう
最初のステップは字句解析です。正規表現を作成し、その中のすべての単語と数値記号を切り出す必要があります。
文法ルールを構築する ここでは LL(1) 文法を選択しました。ここで独自の文法を設計してください。
中間コードをビルドします。ここでは構文ツリーを使用しました。
変換プログラムを書き、どのような文法文がどのようなプログラムに対応するかを書きます。
字句解析:
正規表現を入力し、その正規表現を nfa->dfa->dfa 最小化に変換します。この部分については、Java を使用する NetEase Cloud Classroom コンパイラにアクセスしてください。前の NFA 部分については、上記のビデオに従ってください。
dfa が最小化するテーブルを取得します。すべての正規表現に必要なのは、このテーブルだけです。したがって、正規表現を決定した後は、毎回テーブルを生成することなく、直接テーブルを保存できます。
それから、たくさんの正規表現が必要です
数値用に1つ
記号用に1つ
キーワード用に1つ
変数名用に1つ
「何でも" 1 つ (これはエラーの処理に使用できます。上記の 1 ~ 4 以外の場合は、受信と除外に 5 を使用できます)
var id_ = new build_rule(); id_.build_from_str(id__str, 3); //这个变量id__str就是那个已经生成字符串保存起来的dfa最小化的表 //数字3就是id对应的名字,到时候用来判断来生成类型码的 var key_word = new build_rule(); key_word.build_from_str(key_word_str, 1); //和上面一样 var ops = new build_rule("{op}{op}*", 1); //这个使用正则生成的规则的,需要经过nfa---dfa---最小化这几步的转化 //1符号和关键字统称的类型 var num = new build_rule("{float}", 4); //同上 var anything = new build_rule(); anything.build_from_str(anything_str); anything.rule_name = 5; //这个就是用来处理错误的,识别5这个类型时候就会出错,也可以记录这个出错让程序一直扫描到后面再输出错误 //按照自己定义的规定的顺序进行添加规则,到时候就会按照这个顺序进行查找 var qing = qingai(code); qing.add_rules(key_word); qing.add_rules(id_); qing.add_rules(ops); qing.add_rules(num); qing.add_rules(anything); qing.action();
すべての正規表現は順番にあります。自分のアレンジが大事。たとえば、順序は次のとおりです:
変数名——–>キーワード————>その他
この場合、"var"が認識されれば、varは変数名とみなされます。これは、varがキーワードとして定義されていない場合、これを正当な変数名として使用できるためです。
したがって、順序は自分で調整する必要があります
複数の正規表現とその順序を構築した後、作業が始まります。
ソースコードは先頭からスキャンされ、メインポインタは先頭を指します
ポインタは先頭を指します
最初のルールから開始します
dfaによるとオートマトンのルール、つまりテーブルに遭遇したとき 任意の文字に到達したら、その行にジャンプします
次の文字を読んでもまだジャンプできる場合は、別の行にジャンプします。ジャンプできない場合は、この行に終了マークがあるかどうかを確認し、終了マークがある場合は、見つかった文字列の長さをメイン ポインタに追加し、この文字列の情報を記録します。行、その列、タイプ。そうでない場合は、次のルールを見つけます。
allルールがあるため、誰もが属性を見つけることができます。
スペースや改行があるため、最後に判断して除外する必要があるため、まだ見つからないものもあります。
そうすれば、あなたが書いたソースコードに基づいてそのようなテーブルを取得できます
a=7464;b=7465;a=b+7464*2;
8. 次の型コードは、この型の文字列を文法で表現するために使用する必要がある型コードです。その後、文法側はタイプ コードを使用して、入力された文記号が指定された文法に準拠していないかどうかを判断します。キーワードや記号が異なれば意味も異なるため、変数名は d で表されます
手順の概要
正規表現を入力します
マクロ定義を変更します。正規表現を通常の文字に変換します
正規表現をカットします
カットされた式全体をnfa自動マシンに渡し、nfa図を構築します
nfa図を入力しますヘッドノードは、 dfaオートマトンでdfaテーブルを構築します
nfaテーブルをdfa最小化してdfa最小化テーブルを取得します
これで文字列に対応する検索オートマトンの構築が完了します
Repeat 1-すべての正規表現が変換されるまで 7 回続けます。後は、最小化したテーブルをすべて保存し、毎回そのテーブルをロードするだけです。毎回 nfa や dfa などを生成する必要はありません。
ルールを順番にスキャナーに入力し (実際には、ソースプログラムのすべての文字を一度に書き込む単なる while ループです)、スキャンを開始します。
トークンテーブルを取得する
終了
関連記事:
JavaScriptにおける四則演算式の解析アルゴリズムと例
以上がJavaScript を使用して四則演算コンパイラの字句解析を作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。