私はBisonを学んでいて、現時点ではrpcalcの例だけを実行していますが、印刷関数(Cなど)を実装したいのですがprintf
、これを行う方法がわからないため、計画しています。このような構文を使用する必要がありますprint ("Something here");
が、print関数を作成する方法がわからず;
、行末として作成する方法もわかりません。
ご協力いただきありがとうございます。
1 に答える
まず、自分自身に問いかける必要があります。
私の「印刷物(「何か」)の[サブ]部分は何ですか?」構文?
これらの部分を特定したら、適用可能なプロダクションルールとともに、文法構文ルールの形式で「簡単に」説明します。そして、Bisonにパーサーを生成させます。それについてです。
途中で:
半列は、おそらくステートメントを分離するために使用する要素です (別の要素から印刷するための「呼び出し」など)。
'print'自体はおそらくキーワード、またはできればあなたの言語のネイティブ関数名です。printステートメントは、引数としてリテラル文字列
を
使用しているように見えます。リテラル文字列は、二重引用符で開始および終了します(おそらく、それ自体の中でエスケープされた引用符を使用できます)
。上記の太字および斜体の式は、エンティティ(パーサー用語の「記号」)の一部です。あなたの言語の構文。そのためには、次のようなBisonの文法規則を使用します。
stmt : print_stmt ';' | input_stmt ';'| some_other_stmt ';' ;
prnt_stmt : print '(' args ')'
{ printf( $3 ); }
;
args : arg ',' args;
...
セミカラムについての質問だったので、おそらくそのさまざまな使用法から混乱が生じたのかもしれません。たとえば、上記の「;」を参照してください。あなたの言語の構文に属し、それによって; (引用符なし)各文法規則の最後には、Bisonの言語の一部があります。
注:これはもちろん、本質を示すことを目的とした単純な実装です。また、Bisonの構文は少し変わっているかもしれません(そこにある/やったが、ずっと前のことです;-)その後、ANTLRに「会い」 、Bisonに戻らないようにしましたが、軽量で完全に自己完結型の性質がどのようにできるかはわかります場合によっては適切です)