SSブログ
English Version

独自言語 picle のコンパイラ化(その11) [PIC]

 久々にpicleコンパイラをアップデートします。
 今回は軽微な修正2件と言語仕様の追加1件について書きます。

  1. 軽微な修正
     修正は次の2件です。
    • InpKey_() のリターン値の上位バイトクリア
       キー入力情報をリターン値としている InpKey_() で上位バイトがゼロになっていなかったので上位バイトをクリアするようにした。
    • ローカル変数の重複チェック
       ローカル変数宣言で「 var a,b,a; 」のように重複がある場合、エラー検出するようにした。
       エラーにしなくてもプログラムの実行上は問題ないが、スタックエリアが余分に消費されてしまうので修正した。


  2. 他ソースの読込み機能追加
     今回の本題です。
     PIC24FJ64GA002 はフラッシュメモリのサイズはそれなりに大きいのですが、SRAM サイズが小さい(8K)ので picle のソースが大きくなるとメモリ(SRAM)に収まらなくなります。
     ソースサイズを削減するためにコメントやスペースを削ると可読性が悪化してしまいますし、それでも限度があります。
     フラッシュメモリは沢山あるのに picle言語としての利便性がメモリサイズの制限のために著しく限定されてしまうことになります。

     そこで perl の「use」のような(C言語の「#include」のような(Pythonの「import」のような))機能を追加しました。
    • 記述方法
       読込むソース(以降ライブラリと記載)を次の形式で指定します。
      use LibraryName;
    • use の記述場所
       use ステートメントはソースの先頭に置く必要があります。
       ソースの構成は、最初に use ステートメント(複数可、無くても可)、次にグローバル変数宣言(なくても可)、次に関数や処理の記述になります(ソースの可読性を考慮し記述位置を固定にした)
    • ライブラリソースの記述方法
       フラッシュメモリにソースを保存し ¥¥ コマンドで保存ソース一覧を表示した場合、ソースの先頭行が表示されますが、ライブラリ名の記載は先頭行を
      #LibraryName
      とします('#'とライブラリ名の間にはスペースを入れない)。ライブラリ名の後にスペースを入れコメントを書くことも可能。
       ソースの1行目にライブラリ名を入れた状態でフラッシュメモリにセーブする。
    • ライブラリ内の main() 処理
       use で読込むソース内に main() 処理がある場合、main()処理はコンパイル対象外(構文チェックは実施される)
    • 多段読込可能
       use で読込むライブラリソース内でも useステートメントを使用可能。

     上記の対応をした picle コンパイラは「独自言語 picle compiler on PIC24FJ」からダウンロードできます。
     末尾に use 機能試験用ライブラリソースを付けました。use ステートメント試験の実行結果は次のようになります。

    use ステートメントテスト実行結果
    :\\
                                             
    +B400-B4CB #lib1 test library1
    +B800-B87B #lib2 test library2
    
    :l
    
       1:# use statement test
       2:#  2017/03/27 by skyriver
       3:
       4:use lib1;
       5:
       6:proc main() {
       7:   PrnStr_( "\nmain start" );
       8:   VarLib1 = 1;
       9:   VarLib2 = 2;
      10:
      11:   proc1();
      12:
      13:   PrnStr_( "\nVarLib1 = " );
      14:   PrnDec_( VarLib1 );
      15:   PrnStr_( "\nVarLib2 = " );
      16:   PrnDec_( VarLib2 );
      17:}
    :run
    
    main start
    proc1 start
    proc2 start
    VarLib1 = 10
    VarLib2 = 200
    :
    

     library sample source(picle)
    #lib1 test library1                                 
    # 2017/03/27 by skyriver
    
    use lib2;
    
    var VarLib1;
    
    proc proc1() {
        PrnStr_( "\nproc1 start" );
        VarLib1 = 10;
        VarLib2 = 20;
        proc2();
    }
    
    proc main() {
        PrnStr_( "\nlib1 main" );
    }
    
    #lib2 test library2
    # 2017/03/27 by skyriver
    
    var VarLib2;
    
    proc proc2() {
        PrnStr_( "\nproc2 start" );
        VarLib2 = 200;
    }
    


[TOP] [ 前へ ] 連載記事 [ 次へ ]