0

私はこれに2日以上取り組んできましたが、成功しませんでした。これはよくある問題ですが、解決策が見つかりません。検索してみました!

問題:

たとえば、1行あたり5つの値を読みたいデータがあります。以前に読み取った値からいくつ読み取るかを知っています。たとえば、読み取る 6 つの値が 2 行にまたがる...

6
10 20 30 40 50
60

したがって、5 つの変数ごとに新しい行を読みたいと思います。変数が 0 の場合は、これを処理するためにビットをスキップします。正確に 5 の倍数の変数を読み取りたい場合は、NL 呼び出しの重複を避けたいと考えています。

私はこれを試しました...

varblock[ Integer count ]
@init{
Integer varIndex = 0;
}
    : { count > 0 }? ( dp=NUMBER { count--; varIndex++;  }
          { ( varIndex \% 5 ) == 0 }? NL { varIndex = 0; }
          )+ { varIndex > 0 }? => NL
    |
    ;

しかし、私は...

failed predicate: { ( varIndex \% 5 ) == 0 }?

述語を誤解している可能性があります。私の文法には他にも機能しているように見える述語がいくつかありますが、それらはこのタイプではありません。そこでは、入力ファイルのバージョンに応じて、文法の一部をスキップしようとしています。

ありがとう。

4

2 に答える 2

0

NL は、入力行の最後に期待される改行です。

NL    :   ( '\n' | '\r' )+ ;

他の行では、次のような他のいくつかのことを読みます...

「IPE270」 「BS7191GR355C」 0.0 0 0

また、STRING、FLOAT、または NUMBER などの値は、予想される順序でこれらの行にある必要があります。したがって、必要なデータ値を読み取る前に NL が発生した場合は、構文エラーが発生しています。したがって、おそらくあなたの質問に対する答えは「はい」です。

おそらく、私は例を単純化しただけです。

于 2013-01-08T19:04:28.907 に答える
0

解決済み: ブラケットの問題でした。手がかりを得るために、生成されたパーサー コードを調べました。

varblock[ Integer count ]
@init{
   Integer index = 0;
}
   : ( { count > 0 }? => ( NUMBER  { count--; index++; } 
                         | { (index \% 5) == 0 }? => NL ) )+ { index > 0 }? => NL
   |
  ;

これにより、1 行あたり最大 5 つの値が読み取られます。

于 2013-01-22T11:07:16.317 に答える