Excel VBAをJavaScriptに翻訳 その4
Excel VBAをJavaScriptに翻訳 その4:
前回は、VBAの関数をJavaScriptで実現する関数を作成しました。
今回は、VBAのソースを翻訳するにあたり最初の第一歩「字句解析(Lexical Analysis)」をやってみます。
npmからChiffonパッケージをインストールして字句解析の簡単なプログラムを作成します。
翻訳の工程としては、以下のように想定しています。
1. 字句解析 [Lexical Analysis]
2. 構文解析 [Syntactic Analysis]
3. 最適化 [Optimization]
4. コード生成 [Code Generation]
ソースコードを読み込んで、トークン(字句)に分解する工程
Chiffon:https://www.npmjs.com/package/chiffon
字句解析するコンパクトなパーサーライブラリです。
ローカルにインストールします。
字句解析のtype:として返却されるタイプ
ソースの字句解析(パース)を行うJavaScriptです。
二つの関数を定義しています。
Parse : 引数(文字列)から字句解析を行い結果を返却します。
UnParse : 引数(文字列(字句解析結果))から元の文字列を復元し返却します。
ソースを配列で定義、1行ずつ字句解析してコンソールに出力します。
Json形式で字句解析結果が返却されます。
結果には、type:とvalue:それぞれにパース結果がセットされています。
パーサーパッケージを利用して簡単な字句解析のJavaScriptを作成しました。
字句解析結果からtypeがIdentifierの部分を取り出すことで、次の工程の「構文解析」へ進むことができます。
次回は「構文解析」するためにVBAの予約語などを定義します。
はじめに
前回は、VBAの関数をJavaScriptで実現する関数を作成しました。今回は、VBAのソースを翻訳するにあたり最初の第一歩「字句解析(Lexical Analysis)」をやってみます。
npmからChiffonパッケージをインストールして字句解析の簡単なプログラムを作成します。
翻訳の工程としては、以下のように想定しています。
1. 字句解析 [Lexical Analysis]
2. 構文解析 [Syntactic Analysis]
3. 最適化 [Optimization]
4. コード生成 [Code Generation]
前提
- OS : Windows7以上
- PoweShellのターミナルで実行
- VSCodeでコード編集
- node.js環境構築済み
字句解析とは
ソースコードを読み込んで、トークン(字句)に分解する工程
Chiffon
Chiffon:https://www.npmjs.com/package/chiffon字句解析するコンパクトなパーサーライブラリです。
ローカルにインストールします。
npm install --save chiffon
字句解析タイプ
字句解析のtype:として返却されるタイプタイプ | 説明 |
---|---|
Comment | コメント |
WhiteSpace | 空白 |
LineTerminator | 改行 |
Template | テンプレート |
String | 文字 |
Punctuator | 句読点・疑問符・括弧 |
RegularExpression | 正規表現 |
Numeric | 数値 |
Identifier | 識別子 |
Null | ヌル |
Boolean | 真偽値 |
Keyword | 検索キー |
tomparse.js
ソースの字句解析(パース)を行うJavaScriptです。var Chiffon = require('Chiffon'); /** * < Defined token type > * * Comment - コメント * WhiteSpace - 空白 * LineTerminator - 改行 * Template - テンプレート * String - 文字 * Punctuator - 句読点・疑問符・括弧 * RegularExpression - 正規表現 * Numeric - 数値 * Identifier - 識別子 * Null - ヌル * Boolean - 真偽値 * Keyword - 検索キー * * <Tokenize Options> * * comment : {boolean} default=false * Keep comment tokens. * * whiteSpace : {boolean} default=false * Keep white space tokens. * * lineTerminator : {boolean} default=false * Keep line terminator tokens. * * range : {boolean} default=false * Include an index-based location range. (array) * * loc : {boolean} default=false * Include line number and column-based location info. * */ var options = { comment: false, // コメント whiteSpace: false, // 空白 lineTerminator: false // 改行 }; function Parse(s) { return Chiffon.tokenize(s, options); } function UnParse(s) { return Chiffon.untokenize(s, options); } module.exports = { Parse: Parse, UnParse: UnParse }; /* // Test Demo var demo = Parse('Debug.Print("Hello, World")'); console.log(demo); */
Parse : 引数(文字列)から字句解析を行い結果を返却します。
UnParse : 引数(文字列(字句解析結果))から元の文字列を復元し返却します。
tomtest2.js
ソースを配列で定義、1行ずつ字句解析してコンソールに出力します。var f = require('./tomparse.js'); // VBA var src = [ 'Debug.Print("Hello, World")', 'MsgBox("Hello, World")', 'Debug.Print(Date)' ]; // src Parse Output for (i =0 ; i < src.length ; i++) { var Data = f.Parse(src[i]); console.log(Data); }
実行
node tomtest2.js
結果には、type:とvalue:それぞれにパース結果がセットされています。
PS C:\**\tom> node tomtest2.js [ { type: 'Identifier', value: 'Debug' }, { type: 'Punctuator', value: '.' }, { type: 'Identifier', value: 'Print' }, { type: 'Punctuator', value: '(' }, { type: 'String', value: '"Hello, World"' }, { type: 'Punctuator', value: ')' } ] [ { type: 'Identifier', value: 'MsgBox' }, { type: 'Punctuator', value: '(' }, { type: 'String', value: '"Hello, World"' }, { type: 'Punctuator', value: ')' } ] [ { type: 'Identifier', value: 'Debug' }, { type: 'Punctuator', value: '.' }, { type: 'Identifier', value: 'Print' }, { type: 'Punctuator', value: '(' }, { type: 'Identifier', value: 'Date' }, { type: 'Punctuator', value: ')' } ] S C:\**\tom>
まとめ
パーサーパッケージを利用して簡単な字句解析のJavaScriptを作成しました。字句解析結果からtypeがIdentifierの部分を取り出すことで、次の工程の「構文解析」へ進むことができます。
次回は「構文解析」するためにVBAの予約語などを定義します。
コメント
コメントを投稿