Visitor クラス (オプションの処理)


すべての関数はOptionクラスのインスタンスであるオプションパラメータを取得します。 このクラスのfilterで使用されるプロパティは以下です。

  • txt: オプションすべてを文字列で表します。
  • args: オプションの引数を一覧表示します。多くの場合、最初の項目のみを検索します。

visitor のフィルタは QAVisitor または、GNUベースの場合、GNU機能を使用したい場合はQAGNUVisitor のいずれかから継承します。

デフォルトのパーサオプション

visitor クラスのコンストラクタにいくつかのデフォルトオプションを指定することができます。例えば、このクラスはGNU Visitorから継承し、値のリストをこのコンパイラ用に修正します。

class QAWindRiverVisitor(QAGnuVisitor):
    def __init__(self):
        debug("QAWindRiverVisitor::__init__()")
        super(QAWindRiverVisitor, self).__init__()
        # GNUと同じ parser_options だが、 -ex dollar -なし
        self._qac_parser_options = {'bits': False, 'u': False}

後に更新される場合の除き、このCCTはCCTで生成された以下の行を持ちます。

-u-
-bits-

-u のデフォルト値が -u+ になるはずである場合、False は True に置換されます。

self._qac_parser_options = {'bits': False, 'u': True

この例は、C言語のCCTに対するオプションのみのリストを生成します。その他のメンバ変数は C++ CCTを生成するのに使用される _qacpp_parser_options です。

オプションの処理

オプションに処理を加えるには、'visit' を名前に使いその後にアンダースコアを続けて記述を始める関数をVisitorクラスに追加します。 オプションの先頭に使用されているマイナスサインを除き、その他のマイナスサインはアンダースコアに置換してください。

例えば、--signed-bitfields オプションを処理するには GNUの visitor は以下のように記述します。

def visit_signed_bitfields(self, option):
    self._set_option('bits')

使用中の言語のオプションリストに _set_option がある場合、このオプションへの呼出しはオプションを有効にします。

デフォルトの初期値のないオプションの設定には、以下の例に示すように _set_option_always オプションを使用します。

def visit_finput_charset(self, option):
    self._set_option_always('encoding', option.args[0])
ファイル名の入力および、ファイルの無視

コマンドラインにインプットしたファイル名すべてに対し関数 visit_input_file_name が呼出されます。通常、CCTジェネレータにアセンブラ処理を無視させるために使用します。例:

def visit_input_file_name(self, option):
    if option.txt.upper().endswith('.S'):
        # armclang の例にはアセンブラ用の .S ファイルがある
        debug("ArmClang filter stopping for assembly file: " + option.txt)
        self.visit_stop_after_preprocess(option)
    else:
        super(QAArmClangVisitor, self).visit_input_file_name(option)

関数 visit_stop_after_preprocess はこの関数以降のコマンドラインのプロセスを停止します。


オプションのエイリアス

QAVistorから継承するときのエイリアスのリストの設定法は以下です。

class _QARenesasVisitor(QAVisitor):
    _aliases = {
        # cc-rh は Xpreincludeを使用。 cc-rl は preincludeを使用。
        'preinclude': ['Xpreinclude'],
    }

visitor クラスのフィルタが QAGNUVisitor から継承する場合、add_alias 関数を使用してデフォルトリストを追加することができます。

self.add_alias('signed_bitfields', ['Xbit-fields-signed']) 

このフィルタは -Xbit-fields-signedオプションがある時に visit_signed_bitfields コードを実行します。

使用するオプションはすべて non_gnu_options パラメータの filter_init 関数に加える必要がることに留意してください。

filter_init(
    "DIAB",
    non_gnu_options={
        'Xbit-fields-signed': [0],
        'Xdollar-in-ident': [0],
        'Xpreprocess-assembly': [0],
    },
)

visitor クラスが GNU Visitor から継承しない場合、オプションを指定する代わりに compiler_options 設定を使用することができます。その場合、デフォルトのGNUオプションへの追加ではなくオプションの完全なリストが使用可能です。