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
レコード (つまり、タグ) を見つけ、最後に注釈を返します。record
Record
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 つを使用しました)。a
b
Record
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" }