JFlex を使用して Fitnesse 用のレクサーを作成しようとしていますが、WikiWords (http://fitnesse.org/FitNesse.UserGuide.WikiWord) で問題が発生しています。
リンクされた正規表現をコピーし、トークンに次の正規表現を使用しています。
. # Regular character
[A-Z]([a-z0-9]+[A-Z][a-z0-9]*)+ # WikiWord
しかし、私は適切にレクシングするのに苦労してThisIsNotAWikiWord
います。大文字が 2 つ連続しているため、通常の単語とは見なされません。そのため、次の文字が文字か数字かを確認する先読みを追加する必要があります。のようなもの[A-Z]([a-z0-9]+[A-Z][a-z0-9]*)+ / [^A-Za-z0-9]
。
これは lexingThisIsNotAWikiWord
には問題なく機能しますが、一般的に lexing WikiWords を壊します。lexingWikiWord
の場合、先読み用の余分な文字がないため、一致しません。
オプションの先読みが必要だと思います。この後に文字がある場合は、これらのいずれでもない方がよいでしょう。しかし、入力に別の文字がない場合は、一致させましょう。
ドキュメンテーションは、これは不可能だと私に信じさせますが、それが私の正規表現の欠如であることを望んでいます。ドキュメントから:
字句規則では、正規表現 r の後に先読み式を続けることができます。先読み式は、「$」(行末演算子) または「/」の後に任意の正規表現が続きます。どちらの場合も、先読みは消費されず、一致したテキスト領域に含まれませんが、どのルールが最も長く一致するかを判断する際に考慮されます (4.3.3 入力が一致する方法も参照してください)。
'$' の場合、r は入力の行末でのみ一致します。行の終わりは正規表現 \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085 で示されます。したがって、a$ は / \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085 と同等です。これは、[5] で説明されている状況とは少し異なります。 JFlex $ は真の後続コンテキストであり、ファイルの終わりは行の終わりとしてカウントされません。