0

キーと値を次のように定義できる DSL の単純な側面があります。

mykey=\
   This is my $REF{useful}
   multiline
   string
   where I terminate with a backslash
   but I support escaped \\ characters
   and I wish to handle the value part of this string
   as 3 blocks in this example.
\

この例で必要な 3 つのトークン (値の部分) は次のとおりです。

  • ValueLiteral == これは私のものです
  • ValueReference == $REF{便利}
  • ValueLiteral == 複数行など....

値のルールを次のように定義しました。

void multiLineValue(): {} {
  < BACKSLASH >< EOL >
  (
    valuePartLiteralMulti() |
    valuePartRef()
  )*
  < BACKSLASH >
}

複数行の文字列型の TOKEN 定義は次のとおりです。

TOKEN :
{
     < MULTILINE_STRING:(  ( (~["\\"])
    | ("\\"
        ( ["\\", "'", "\"", "$", "n", "r", "t", "b", "f"]
        | ["u", "U"]["+"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]
        )
      ) ))+>
}

私の問題は、複数行の文字列トークン タイプが '$REF{' 文字の文字シーケンスも消費することです。

この複数行の文字列を変更して、エスケープされていない "$REF{" に遭遇したときに文字の消費を停止するようにします (ただし、"\$REF{" シーケンスを超えて読み続けます)。

どんな援助でも大歓迎です。

4

1 に答える 1

2

よくわかりませんが、トークンの定義に$(ユニコードで?)も含めます。最初に〜( "$")(または同等のユニコード)を追加する必要があります。

または、LOOKAHEAD(valuePartRef())...のような構文LOOKAHEADを使用できます。

ps複数のREFを持つことができますか?

于 2010-12-08T13:32:20.327 に答える