0

XText でプリプロセッサ命令のルールを書こうとしています。現在、私はこのように実装しました:

preproc:
    type=PREPROCESSOR_INCLUDE_TYPE val=(STRING | PREPROCESSOR_INCLUDE_VAL)| 
    type=PREPROCESSOR_DEFINE_TYPE | 
    type=PREPROCESSOR_SINGLE_PARAM_TYPE val=ID|
    type=PREPROCESSOR_NONE_PARAM_TYPE
;


terminal PREPROCESSOR_INCLUDE_TYPE: '#include'| '#import';

terminal PREPROCESSOR_INCLUDE_VAL: ' '+ '<'->'>';

terminal PREPROCESSOR_DEFINE_TYPE: '#define' -> '\n';

terminal PREPROCESSOR_SINGLE_PARAM_TYPE: '#undef' |'#ifdef' |'#ifndef' |'#pragma';

terminal PREPROCESSOR_NONE_PARAM_TYPE: '#else' | '#endif';

私はこの解決策があまり好きではありませんが、私が試したすべての解決策の中で唯一機能するものです。プリプロセッサ命令のルールを作成するよりスマートな方法はありますか?

PREPROCESSOR_DEFINE_TYPE ルールを分割して、プリプロセッサ命令タイプ (#define) をその値から分離するにはどうすればよいですか?

どうもありがとう

編集

これらのルールで捉えたいのは、典型的なプリプロセッサ命令です。例えば:

#include "fileName"
#import <fileName>

#define IDENTIFIER
#define IDENTIFIER WHATEVER + YOU - WANT !

#undef IDENTIFIER

#else
#endif

あると便利なのは、すべての異なるケースでプリプロセッサの型をその値から分割することです

ラファエロ。

4

2 に答える 2

0

私があなたの質問を理解しているなら、ルールを定義するためのASTノードが必要です。これは、ルールの残りの部分と属性を持ちますが、#defineキーワードは含まれていません。

untilルールまたは可能な否定( )ルールの問題!は、と命令の間の空白文字との競合が発生する#defineため、簡単に解決できないことです。

ただし、次のように、たとえば文字または_で始まり、改行で終わる新しい端末を定義することができます。これは、言語に追加できます。

PREPROCESSOR_DEFINE_TYPE: '#define' instruction=Content 
;

terminal Content:
    ('a'..'z'|'A'..'Z'|'_') -> '\n'
;

ソリューションをテストしませんでしたが、Xtextエディターでエラーは発生せず、からのIDパラメーターの定義と非常によく似ているため、Terminals.xtext必要なものに近いはずです。

さらに、すべてのプリプロセッサタイプを端末として定義する必要はないと思います。こうすることで、それらははるかに低レベルの構造になります。可能な限り非終端規則としてそれらを定義します。

于 2011-07-14T09:40:09.630 に答える