2

xtext を使用して忍者ビルドの文法を定義しようとしています。

答えられないトリッキーな点が3つあります。

  • タブごとのインデント:

インデントの処理方法。ninja ビルド ファイルのルールには、前にタブ スペースを付けた複数の変数定義が含まれる場合があります (make ファイルと同様)。これは、言語に SL コメントがあり、空白を無視し、タブによるインデントを行う場合に問題になります (python、make など)。

cflags = -g
rule cc
  command = gcc $cflags -c $in -o $out
  • 変数名の予約済みセットの相互参照:

予約変数のセットが存在します。オートコンプリートは、予約済みの変数セットとユーザー定義の変数セットの両方を参照できる必要があります。

command = gcc $cflags -c $in -o $out
  • WS で区切られていない相互参照変数名のオートコンプリート

org.eclipse.xtext.common.Terminals は WS トークンを隠します。ID トークンは空白で区切られます。ただし、忍者スクリプト (make ファイルに似ています) では、最長一致変数名を使用して解析を行う必要があります。

some_var = some_value
command  = $some_var.h

どんなアイデアでも大歓迎です。ありがとう。

4

1 に答える 1

1

Xtext 2.8.0 リリースをチェックしてください: https://www.eclipse.org/Xtext/releasenotes.html

Whitespace-Aware Languagesセクションには次のように記載されています。

Xtext 2.8 は、Python のようにコード ブロックを区切るためにインデントを使用するなど、空白を使用して構造を指定する言語をサポートします。これは、文法で定義された合成トークンを介して行われます。

terminal BEGIN: 'synthetic:BEGIN';
terminal END: 'synthetic:END';

これらのトークンは、文法規則の他の端末と同様に使用できます。

WhitespaceAwareBlock:
    BEGIN
        ...
    END;

Eclipse の例 ([ファイル] → [新規] → [例] → [Xtext の例]) で使用できる新しいサンプル言語のホーム オートメーションは、この概念を示しています。次のようなコードを許可します。

Rule 'Report error' when Heater.error then
    var String report
    do
        Thread.sleep(500)
        report = HeaterDiagnostic.readError
    while (report == null)
    println(report)

詳細については、ドキュメントを参照してください。

于 2015-04-16T11:03:39.687 に答える