===========
Single rule
===========

rule my_rule {
    condition:
        true
}

---

(yara_file
    (rule 
        head: (rule_head
            id: (identifier)
        )
        body: (rule_body 
            condition: (bool_literal)
        )
    )
)


==========
Empty file
==========

---

(yara_file)


==============
Multiple rules
==============

rule my_rule1 {
    condition:
        true
}

rule my_rule2 {
    condition:
        true
}

rule my_rule3 {
    condition:
        true
}

---

(yara_file
    (rule
        (rule_head
            (identifier)
        )
        (rule_body
            (bool_literal)
        )
    )
    (rule
        (rule_head
            (identifier)
        )
        (rule_body
            (bool_literal)
        )
    )
    (rule
        (rule_head
            (identifier)
        )
        (rule_body
            (bool_literal)
        )
    )
)


====
Tags
====

rule abc : ab cd ef {
    condition:
        true
}

---

(yara_file
    (rule
        head: (rule_head
            id: (identifier)
            tags: (tag_list
                (tag
                    id: (identifier)
                )
                (tag
                    id: (identifier)
                )
                (tag
                    id: (identifier)
                )
            )
        )
        body: (rule_body
            condition: (bool_literal)
        )
    )
)


=============
Rule modifier
=============

private rule test {
    condition:
        true
}

----

(yara_file
    (rule
        head: (rule_head
            mods: (rule_mod_list
                (rule_modifier)
            )
            id: (identifier)
        )
        body: (rule_body
            condition: (bool_literal)
        )
    )
)


=======================
Multiple rule modifiers
=======================

private global rule test {
    condition:
        true
}

----

(yara_file
    (rule
        head: (rule_head
            mods: (rule_mod_list
                (rule_modifier)
                (rule_modifier)
            )
            id: (identifier)
        )
        body: (rule_body
            condition: (bool_literal)
        )
    )
)


=====================
Unknown rule modifier
=====================

protected rule test {
    condition:
        true
}

---

(yara_file
    (ERROR 
        (identifier)
    )

    (rule
        head: (rule_head
            id: (identifier)
        )
        body: (rule_body
            condition: (bool_literal)
        )
    )
)


=======
Complex
=======

private rule test : abc def ghi {
    condition:
        true
}

---

(yara_file
    (rule
        head: (rule_head
            mods: (rule_mod_list
                (rule_modifier)
            )
            id: (identifier)
            tags: (tag_list
                (tag
                    id: (identifier)
                )
                (tag
                    id: (identifier)
                )
                (tag
                    id: (identifier)
                )
            )
        )
        body: (rule_body
            condition: (bool_literal)
        )
    )
)


============
Missing tags
============

rule test : {
    condition:
        true
}

----

(yara_file
    (rule
        head: (rule_head
            id: (identifier)
        )
        (ERROR)
        body: (rule_body
            condition: (bool_literal)
        )
    )
)
