[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This appendix summarizes the syntactical rules of the Q language. Please refer to Lexical Matters, for a detailed discussion of lexical matters. The syntax rules are given in BNF with the following extensions:
{ }
denotes repetition; the enclosed elements may be repeated zero or
more times.
[ ]
denotes optional parts; the enclosed elements may be omitted.
The left-hand and right-hand sides of syntax rules are separated with a
colon, and the |
symbol denotes different alternatives. Identifiers
stand for nonterminal grammar symbols, and terminal symbols are enclosed
in single quotes.
In order to keep the grammar to a reasonable size, it does not specify the precedence of operator symbols. Expressions are parsed according to the precedence and associativity of operator symbols specified in Built-In Operators. A `=' symbol occuring unparenthesized in an equation separates left- and right-hand side.
script : {declaration|definition}
declaration : unqualified-import
| qualified-import
| prefix headers ';'
| [scope] 'type' unqualified-identifier
[':' identifier] ['=' sections] ';'
| [scope] 'extern' 'type' unqualified-identifier
[':' identifier] ['=' sections] ';'
| [scope] 'type' qualified-identifier
['as' unqualified-identifier] ';'
| [scope] 'type' unqualified-identifier
'==' identifier ';'
| '@' ['+'|'-'] unsigned-number
unqualified-import : 'import' module-spec {',' module-spec} ';'
| 'include' module-spec {',' module-spec} ';'
qualified-import : 'from' module-spec 'import' [symbol-specs] ';'
| 'from' module-spec 'include' [symbol-specs] ';'
module-spec : module-name ['as' unqualified-identifier]
module-name : unqualified-identifier
| string
symbol-specs : symbol-spec {',' symbol-spec}
symbol-spec : unqualified-identifier ['as' unqualified-identifier]
| unqualified-opsym ['as' unqualified-opsym]
prefix : scope
| [scope] modifier {modifier}
scope : 'private'|'public'
modifier : 'const'|'special'|'extern'|'var'|'virtual'
headers : header {',' header}
header : unqualified-identifier '=' expression
| unqualified-identifier
{['~'] variable-identifier}
| qualified-identifier
{['~'] variable-identifier}
['as' unqualified-identifier]
| '(' unqualified-opsym ')'
{['~'] variable-identifier}
['@' precedence]
| '(' qualified-opsym ')'
{['~'] variable-identifier}
['@' precedence]
['as' unqualified-opsym]
precedence : unsigned-number
| '(' operator ')'
sections : section {'|' section}
section : [prefix] headers
definition : expression
lqualifiers '=' expression qualifiers ';'
{lqualifiers '=' expression qualifiers ';'}
| 'def' expression '=' expression
{',' expression '=' expression} ';'
| 'undef' identifier {',' identifier} ';'
lqualifiers : [qualifier {qualifier} ':']
qualifiers : {qualifier}
qualifier : condition
| where-clause
condition : 'if' expression
| 'otherwise'
where-clause : 'where' expression '=' expression
{',' expression '=' expression}
expression : identifier
| 'var' unqualified-identifier
| variable-identifier ':' identifier
| number
| string
| expression expression
| unary-op expression
| expression binary-op expression
| 'if' expression 'then' expression
['else' expression]
| '\' expression { expression } '.' expression
| '(' [element-list|enumeration|comprehension] ')'
| '[' [element-list|enumeration|comprehension] ']'
| '{' [element-list|enumeration|comprehension] '}'
| '(' op ')'
| '(' expression binary-op ')'
| '(' binary-op expression ')'
element-list : expression-list [',' | ';' | '|' expression]
enumeration : expression-list '..' [expression]
comprehension : expression ':' expression-list
expression-list : expression {',' expression}
| expression {';' expression}
identifier : unqualified-identifier
| qualified-identifier
qualified-identifier : module-identifier '::'
unqualified-identifier
unqualified-identifier : variable-identifier
| function-identifier
| type-identifier
module-identifier : letter {letter|digitsym}
type-identifier : letter {letter|digitsym}
variable-identifier : uppercase-letter {letter|digitsym}
| '_'
function-identifier : lowercase-letter {letter|digitsym}
op : unary-op|binary-op
unary-op : opsym
binary-op : opsym|'and' 'then'|'or' 'else'
opsym : unqualified-opsym
| qualified-opsym
qualified-opsym : module-identifier '::'
unqualified-opsym
unqualified-opsym : function-identifier
| punctsym {punctsym}
number : ['-'] unsigned-number
unsigned-number : '0' octdigitseq
| '0x' hexdigitseq
| '0X' hexdigitseq
| digitseq ['.' [digitseq]] [scalefact]
| [digitseq] '.' digitseq [scalefact]
digitseq : digit {digit}
octdigitseq : octdigit {octdigit}
hexdigitseq : hexdigit {hexdigit}
scalefact : 'E' ['-'] digitseq
| 'e' ['-'] digitseq
string : '"' {char} '"'
letter : uppercase-letter|lowercase-letter
uppercase-letter : 'A'|...|'Z'|uppercase unicode letter
lowercase-letter : 'a'|...|'z'|'_'|lowercase unicode letter
digitsym : '0'|...|'9'|unicode digit
punctsym : unicode punctuation character
digit : '0'|...|'9'
octdigit : '0'|...|'7'
hexdigit : '0'|...|'9'|'a'|...|'f'|'A'|...|'F'
char : any character but newline and |
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated by Albert Gräf on February, 23 2008 using texi2html 1.76.