Created
May 4, 2016 20:09
-
-
Save mkholodnyak/4c6486374a5bd024a50e59dc5f42cb00 to your computer and use it in GitHub Desktop.
Yate Grammar
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module ::= block | |
block ::= ( import | include | template | function_ | key | var_ | block_expr )* | |
body ::= '{' block '}' | '[' block ']' | |
import ::= 'import' inline_string | |
include ::= 'include' inline_string | |
template ::= 'match' jpath ( '|' jpath )* template_mode? arglist? body | |
template_mode ::= QNAME | |
arglist ::= '(' arglist_item ( ',' arglist_item )* ')' | |
arglist_item ::= ( 'nodeset', 'boolean', 'scalar' )? QNAME ( '=' inline_expr )? | |
function_ ::= 'func' QNAME arglist body | |
external ::= 'external' typedef QNAME argtypes | |
argtypes ::= '(' ( typedef ( ',' typedef )* )? ')' | |
key ::= 'key' QNAME '(' inline_expr ',' inline_expr ')' body | |
var_ ::= QNAME '=' block_expr | |
block_expr ::= if_ | for_ | apply | attr | xml_line | array | object | pair | subexpr | |
if_ ::= 'if' multiline_expr body else_if* else_? | |
else_if ::= 'else if' multiline_expr body | |
for_ := 'for' multiline_expr body | |
apply := 'apply' ( inline_expr | array | object ) template_mode? callargs? | |
callargs := '(' ( callarg ( ',' callarg )* )? ')' | |
callarg := object | array | multiline_expr | |
attr := '@' QNAME ( '=' | '+=' ) block_expr | |
array := '[' block ']' | |
object := '{' block '}' | |
pair := inline_expr ':' block_expr | |
subexpr := '(' block ')' | |
xml_line := (xml_full | xml_empty | xml_start | xml_end)+ | |
xml_full := xml_start ( xml_full | xml_empty | xml_text )* xml_end | |
xml_start := '<' QNAME ( xml_attrs )? '>' | |
xml_empty := '<' QNAME ( xml_attrs )? '/>' | |
xml_end := '</' QNAME '>' | |
xml_text := string_content | |
xml_attrs := xml_attr* | |
xml_attr := QNAME ( ':' QNAME )? '=' inline_string | |
inline_expr := inline_or | |
inline_or := inline_and ( '||' inline_or )? | |
inline_and := inline_eq ( '&&' inline_and )? | |
inline_eq := inline_rel ( ( '==' | '!=' ) inline_rel )? | |
inline_rel := inline_add ( ( '<=' | '<' | '>=' | '>' ) inline_add )? | |
inline_add := inline_mul ( ( '+' | '-' ) inline_add )? | |
inline_mul := inline_unary ( ( '/' | '*' | '%' ) inline_mul )? | |
inline_unary := '-' inline_not | inline_not | |
inline_not := '!' inline_union | inline_union | |
inline_union := inline_primary ( '|' inline_union )? | |
inline_primary := inline_number | inline_string | inline_subexpr | jpath | inline_function | inline_var | |
inline_number := NUMBER | |
inline_string := '"' string_content '"' | |
inline_subexpr := '(' inline_expr ')' | |
inline_var := QNAME | |
inline_function := QNAME callargs | |
jpath := '/'? jpath_steps | |
jpath_steps := jpath_step* | |
jpath_step := jpath_dots | jpath_nametest | jpath_predicate | |
jpath_parents := '.'+ | |
jpath_nametest := '.' ( QNAME | '*' ) | |
jpath_predicate := '[' multiline_expr ']' | |
cdata := ':::' strings ':::' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment