JAPE 文法を使用して if-else ステートメントを作成するために、必ずしも RHS で Java を使用する必要はありません。
ルールを記述する場合、処理を複数の段階に分割すると便利な場合がよくあります。各段階で結果が生成され、次の段階に渡すことができます。したがって、今説明した内容に基づいて、データ処理は次の 3 つのフェーズに分けることができます。
- ドキュメント内のレコード、つまり
Record注釈を返すRecordFinder 。
- ドキュメント内のタグを
a返すTagFinderb。
- Intersection
a : タグとbレコード内を検索します。
ファイルMain.jape
MultiPhase: Main
Phases:
RecordFinder
TagFinder
Intersection
ファイルRecordFinder.jape
このフェーズでは、ドキュメント内のレコードに注釈を付けることができます。この JAPE ファイルの唯一のルールは、トークン(つまり、トークナイザーによって返される注釈) を入力として読み取り、ドキュメント内のTokenレコード (つまり、タグ) を見つけ、最後に注釈を返します。recordRecord
Optionsでは、コントロールがfirstとして設定されていることに注意してください。これは、 token を含み<record>、その後に 1 つ以上の他の token が続き、その後にtoken が続くシーケンスの最初の出現を見つけることが目的であるため</record>です。
Phase: RecordFinder
Input: Token
Options: control = first debug = true
// The following rule is able to find the sentence within a record
Rule: RuleToFindRecord
(
({Token.string == "<"} {Token.string == "record"} ({Token})* {Token.string == ">"})
({Token})*
({Token.string == "<"} {Token.string == "/"} {Token.string == "record"} {Token.string == ">"})
):match
-->
:match.Record = { rule = "RuleToFindRecord" }
ファイルTagFinder.jape
このフェーズでは、トークンaを入力として読み取り、タグとbテキスト内を検索し、最後aにb注釈を返します。
Phase: TagFinder
Input: Token
Options: control = first debug = true
// The following rule is able to find the tag "a" within the document.
Rule: RuleToFindTag_a
(
(
({Token.string == "<"} {Token.string == "a"} {Token.string == ">"})
({Token})*
({Token.string == "<"} {Token.string == "/"} {Token.string == "a"} {Token.string == ">"})
)
|
({Token.string == "<"} {Token.string == "a"} {Token.string == "/"} {Token.string == ">"})
):match
-->
:match.a = { rule = "RuleToFindTag_a" }
// The following rule is able to find the tag "b" within the document.
Rule: RuleToFindTag_b
(
(
({Token.string == "<"} {Token.string == "b"} {Token.string == ">"})
({Token})*
({Token.string == "<"} {Token.string == "/"} {Token.string == "b"} {Token.string == ">"})
)
|
({Token.string == "<"} {Token.string == "b"} {Token.string == "/"} {Token.string == ">"})
):match
-->
:match.b = { rule = "RuleToFindTag_b" }
ファイルIntersection.jape
Recordこのフェーズでは、注釈aおよびを入力として読み取り、 タグまたは内bを検索します。これは、 contains演算子とwithin演算子に関するリファレンスとしてお読みください(以下のルールでこれらの演算子の 1 つを使用しました)。abRecord
Phase: Intersection
Input: Record a b
Options: control = first debug = true
// A record matches with this rule if it contains both tag a and tag b.
Rule: Rule_1
(
{Record contains a, Record contains b}
):match
-->
:match.Record_with_both_tags = { rule = "Rule_1" }
// A record matches with this rule if it contains tag a.
Rule: Rule_2
(
{Record contains a}
):match
-->
:match.Record_with_tag_a = { rule = "Rule_2" }