Anglr Language Syntax Rules
Introduction
This paragraph contains complete set of syntax rules for Anglr Language. These rules are writen in Anglr Language - Anglr is defined with Anglr. Exactly these rules are used to form all tools regarding Anglr Language, including Anglr compiler itself - syntax analyzer for Anglr compiler is made with Anglr compiler.
[ Description Text='General settings' Hover='true' ] [ CompilationInfo NameSpace='Anglr' CodeDir='.' Hover='true' ] %general anglrSettings %{ %} [ Description Text='Declarations' Hover='true' ] [ CompilationInfo ClassName='AnglrDeclarations' NameSpace='Anglr.Declarations' Access='public' Hover='true' ] %declarations anglrDecls %{ [ Description Hover='true' Text='regular expressions representing constant terminal identifiers' ] %regex { vertical-bar \| comma \, colon \: semicolon \; left-curly-bracket \{ right-curly-bracket \} left-bracket \( right-bracket \) left-scanner-bracket \%\{ right-scanner-bracket \%\} left-square-bracket \[ right-square-bracket \] at-sign \@ double-at-sign \@\@ equals-sign \= question-mark \? plus-sign \+ minus-sign \- asterisk \* slash \/ inv-plus-sign \~\+ inv-minus-sign \~\- inv-asterisk \~\* inv-slash \~\/ } [ Description Hover='true' Text='regular expressions representing anglr directives' ] %regex { empty %[ \t]*empty terminal %[ \t]*terminal general %[ \t]*general declarations %[ \t]*declarations rregex %[ \t]*regex scanner %[ \t]*scanner lexer %[ \t]*lexer parser %[ \t]*parser skip skip ttoken terminal revent event push push pop pop } [ Description Hover='true' Text='regular expressions representing' Text='- identifier names' Text='- character strings' Text='- decimal numbers' ] %regex { letter [a-zA-Z_] digit [0-9] identifier {letter}({letter}|{digit}|[-\.])*|<{letter}({letter}|{digit}|[-\. ])*> cstring \"([^"]|\"\")*\"|\'([^']|\'\')*\' number {digit}+ } [ Description Hover='true' Text='all regular expressions together' ] %regex lexical-unit {vertical-bar}|{comma}|{colon}|{semicolon}|{left-curly-bracket}|{right-curly-bracket}|{left-scanner-bracket}|{right-scanner-bracket}|{left-square-bracket}|{right-square-bracket}|{equals-sign}|{empty}|{terminal}|{declarations}|{general}|{rregex}|{scanner}|{parser}|{identifier}|{cstring} [ Description Hover='true' Text='terminal identifiers. Most of them are specified with actual string representations' ] %terminal { <vertical bar> '|' <comma> ',' <left curly bracket> '{' <right curly bracket> '}' <left bracket> '(' <right bracket> ')' <left part bracket> '%{' <right part bracket> '%}' <left square bracket> '[' <right square bracket> ']' <double at sign> '@@' <at sign> '@' <equals sign> '=' <colon> ':' <semicolon> ';' <question mark> '?' <plus sign> '+' <minus sign> '-' <asterisk> '*' <slash> '/' <inv plus sign> '~+' <inv minus sign> '~-' <inv asterisk> '~*' <inv slash> '~/' <any> <cstring> <empty> '%empty' <identifier> <terminal> '%terminal' <general> '%general' <declarations> '%declarations' <regex> '%regex' <scanner> '%scanner' <lexer> '%lexer' <parser> '%parser' <regular expression> <number> <skip> 'skip' <ttoken> 'terminal' <event> 'event' <push> 'push' <pop> 'pop' } [ Description Hover='true' Text='The following terminals are used in <anglr soure> syntax rule and are associated' Text='with different fragments of anglr file. They have no textual representation. They' Text='are always used to distinguish fragments of anglr file. They shall be used by first' Text='indicating the terminal symbol followed by the text of the fragment. Examples are' Text='all productions of <anglr source> syntax rule. The lexical and yntax analysers must' Text='address these rules in a specific way:' Text=' 1) the task of the leading terminal is that the syntax analyzer correctly selects' Text=' the production of <anglr soure> syntax rule by which to analyze the text' Text=' belonging to the fragment.' Text=' 2) The lexical analyser must generate the leading terminal on the first run, enabling' Text=' the syntax analyzer to make the right decision when selecting the rule to use for' Text=' the analysis of the fragment. Other terminal symbols are obtained in the usual' Text=' way by lexical analysis of the text belonging to the fragment.' ] %terminal { <anglr file terminal> <anglr file part list terminal> <anglr file part terminal> <general part terminal> <declaration part terminal> <scanner part terminal> <regular expression list terminal> <regular expression usage terminal> <actions terminal> <action terminal> <skip action terminal> <terminal action terminal> <event action terminal> <push action terminal> <pop action terminal> <lexer part terminal> <parser part terminal> <attribute list terminal> <attribute terminal> <name value list terminal> <name value pair terminal> <anglr definition list terminal> <anglr definition with attribute list terminal> <anglr definition terminal> <single terminal definition terminal> <single regex definition terminal> <block of terminal definitions terminal> <block of regex definitions terminal> <terminal definition terminal> <regex definition terminal> <block terminal definitions terminal> <block terminal definition terminal> <block regex definitions terminal> <block regex definition terminal> <anglr syntax rule list terminal> <anglr syntax rule terminal> <anglr syntax production list terminal> <anglr syntax production terminal> <anglr nested rule terminal> <anglr syntax production list name terminal> <name list terminal> <production name terminal> <marker list terminal> <marker terminal> <g name terminal> <name terminal> <cardinality delimiter terminal> <cardinality terminal> <delimiter terminal> } %} [ Description Text='Scanner for multi-line comment' Hover='true' ] [ Declarations Id='anglrDecls' Hover='true' ] [ CompilationInfo ClassName='CommentRegex' NameSpace='Anglr.RegexLib' Access='public' Hover='true' ] %scanner comment_ctx %{ \*\/ pop [\n\r] skip . skip %} [ Description Text='Scanner for hidden attribute' Hover='true' ] [ Declarations Id='anglrDecls' Hover='true' ] [ CompilationInfo ClassName='AttributeRegex' NameSpace='Anglr.RegexLib' Access='public' Hover='true' ] %scanner attribute_ctx %{ \]\] pop {identifier} skip {equals-sign} skip {cstring} skip [\n\r] skip . skip %} [ Description Text='Scanner for %scanner directive' Hover='true' ] [ Declarations Id='anglrDecls' Hover='true' ] [ CompilationInfo ClassName='ScannerIdRegex' NameSpace='Anglr.RegexLib' Access='public' Hover='true' ] %scanner scanner_id_ctx %{ \/\* push comment_ctx \[\[ push attribute_ctx \/\/[^\n]* skip {identifier} push scanner_part_ctx terminal <identifier> [ \t]+ skip [\n\r] skip %} [ Description Text='Scanner for body of %scanner directive (text between %{ and %} )' Hover='true' ] [ Declarations Id='anglrDecls' Hover='true' ] [ CompilationInfo ClassName='ScannerPartRegex' NameSpace='Anglr.RegexLib' Access='public' Hover='true' ] %scanner scanner_part_ctx %{ \/\* push comment_ctx \[\[ push attribute_ctx \/\/[^\n]* skip {left-scanner-bracket} terminal <left part bracket> {right-scanner-bracket} pop pop terminal <right part bracket> {skip} terminal <skip> {ttoken} terminal <ttoken> {revent} terminal <event> {push} terminal <push> {pop} terminal <pop> {identifier} terminal <identifier> [ \t]+ skip .+ terminal <regular expression> [\n\r] skip %} [ Description Text='Scanner for %regex directive' Hover='true' ] [ Declarations Id='anglrDecls' Hover='true' ] [ CompilationInfo ClassName='RegexIdRegex' NameSpace='Anglr.RegexLib' Access='public' Hover='true' ] %scanner regex_id_ctx %{ \/\* push comment_ctx \[\[ push attribute_ctx \/\/[^\n]* skip {identifier} push regex_part_ctx terminal <identifier> {left-curly-bracket} push regex_block_ctx terminal <left curly bracket> {right-scanner-bracket} pop terminal <right part bracket> [ \t]+ skip [\n\r] skip %} [ Description Text='Scanner for body of %regex directive' Hover='true' ] [ Declarations Id='anglrDecls' Hover='true' ] [ CompilationInfo ClassName='RegexPartRegex' NameSpace='Anglr.RegexLib' Access='public' Hover='true' ] %scanner regex_part_ctx %{ \/\* push comment_ctx \[\[ push attribute_ctx \/\/[^\n]* skip [ \t]+ skip .+ pop pop terminal <regular expression> [\n\r] skip %} [ Description Text='Scanner for body of %regex directive' Hover='true' ] [ Declarations Id='anglrDecls' Hover='true' ] [ CompilationInfo ClassName='RegexBlockRegex' NameSpace='Anglr.RegexLib' Access='public' Hover='true' ] %scanner regex_block_ctx %{ \/\* push comment_ctx \[\[ push attribute_ctx \/\/[^\n]* skip [ \t\n]+ skip {right-curly-bracket} pop pop terminal <right curly bracket> {identifier} push regex_block_part_ctx terminal <identifier> %} [ Description Text='Scanner for body of %regex directive' Hover='true' ] [ Declarations Id='anglrDecls' Hover='true' ] [ CompilationInfo ClassName='RegexBlockPartRegex' NameSpace='Anglr.RegexLib' Access='public' Hover='true' ] %scanner regex_block_part_ctx %{ \/\* push comment_ctx \[\[ push attribute_ctx \/\/[^\n]* skip [ \t]+ skip .+ pop terminal <regular expression> [\n\r] skip %} [ Description Text='Scanner for anglr file' Hover='true' ] [ Declarations Id='anglrDecls' Hover='true' ] [ CompilationInfo ClassName='AnglrRegex' NameSpace='Anglr.RegexLib' Access='public' Hover='true' ] %scanner anglrScanner %{ \/\* push comment_ctx \[\[ push attribute_ctx \/\/[^\n]* skip {vertical-bar} terminal <vertical bar> {comma} terminal <comma> {colon} terminal <colon> {semicolon} terminal <semicolon> {left-curly-bracket} terminal <left curly bracket> {right-curly-bracket} terminal <right curly bracket> {left-bracket} terminal <left bracket> {right-bracket} terminal <right bracket> {left-scanner-bracket} terminal <left part bracket> {right-scanner-bracket} terminal <right part bracket> {left-square-bracket} terminal <left square bracket> {right-square-bracket} terminal <right square bracket> {equals-sign} terminal <equals sign> {double-at-sign} terminal <double at sign> {at-sign} terminal <at sign> {question-mark} terminal <question mark> {plus-sign} terminal <plus sign> {minus-sign} terminal <minus sign> {asterisk} terminal <asterisk> {slash} terminal <slash> {inv-plus-sign} terminal <inv plus sign> {inv-minus-sign} terminal <inv minus sign> {inv-asterisk} terminal <inv asterisk> {inv-slash} terminal <inv slash> {empty} terminal <empty> {terminal} terminal <terminal> {general} terminal <general> {declarations} terminal <declarations> {rregex} push regex_id_ctx terminal <regex> {scanner} push scanner_id_ctx terminal <scanner> {lexer} terminal <lexer> {parser} terminal <parser> {identifier} terminal <identifier> {cstring} terminal <cstring> {number} terminal <number> [ \t]+ skip [\n\r] skip . skip %} [ Description Text='Lexer for anglr file' Hover='true' ] [ UseScanner ScannerId='comment_ctx' ScannerId='attribute_ctx' ScannerId='scanner_id_ctx' ScannerId='scanner_part_ctx' ScannerId='regex_id_ctx' ScannerId='regex_part_ctx' ScannerId='regex_block_ctx' ScannerId='regex_block_part_ctx' InitialScanner='anglrScanner' Hover='true' ] [ CompilationInfo ClassName='AnglrLexer' NameSpace='Anglr.Lexer' Access='public' Hover='true' ] %lexer anglrLexer %{ %} [ Description Text='Parser for anglr file' Hover='true' ] [ Lexer Id='anglrLexer' Hover='true' ] [ Declarations Id='anglrDecls' Hover='true' ] [ CompilationInfo ClassName='AnglrParser' NameSpace='Anglr.Parser' Access='public' Hover='true' ] %parser anglrParser %{ [ Description Hover='true' Text='anglr file fragments' ] ANGLR-FILE-FRAGMENTS { [ Start Hover='true' ] [ Description Hover='true' Text='Syntax rule <anglr source> describes syntax of all possible valid' Text='fragments of anglr source file. Anglr file fragment is any sentence' Text='derived by at least one syntax rule listed below. Since all syntax rules,' Text='except <anglr file>, which specifies contents of any anglr file,' Text='derive nonempty sentences, valid fragments are not empty. Exception' Text='is, ironically, fragment that belongs to whole but empty file,' Text='since <anglr file> syntax rule should derive an empty sentence if' Text='it contains no parts. But empty files do not contain any other' Text='fragments. Conversely, non-empty files contain several fragments.' ] <anglr source> : <attribute list terminal> <attribute list> | <attribute terminal> <attribute> | <name value list terminal> <name value list> | <name value pair terminal> <name value pair> | <anglr file terminal> <anglr file> | <anglr file part list terminal> <anglr file part list> | <anglr file part terminal> <anglr file part> | <general part terminal> <general part> | <declaration part terminal> <declaration part> | <anglr definition list terminal> <anglr definition list> | <anglr definition with attribute list terminal> <anglr definition with attribute> | <anglr definition terminal> <anglr definition> | <single terminal definition terminal> <single terminal definition> | <single regex definition terminal> <single regex definition> | <block of terminal definitions terminal> <block of terminal definitions> | <block of regex definitions terminal> <block of regex definitions> | <terminal definition terminal> <terminal definition> | <regex definition terminal> <regex definition> | <block terminal definitions terminal> <block terminal definitions> | <block terminal definition terminal> <block terminal definition> | <block regex definitions terminal> <block regex definitions> | <block regex definition terminal> <block regex definition> | <scanner part terminal> <scanner part> | <regular expression list terminal> <regular expression list> | <regular expression usage terminal> <regular expression usage> | <actions terminal> <actions> | <action terminal> <action> | <skip action terminal> <skip action> | <terminal action terminal> <terminal action> | <event action terminal> <event action> | <push action terminal> <push action> | <pop action terminal> <pop action> | <lexer part terminal> <lexer part> | <parser part terminal> <parser part> | <anglr syntax rule list terminal> <anglr syntax rule list> | <anglr syntax rule terminal> <anglr syntax rule> | <anglr nested rule terminal> <anglr nested rule> | <anglr syntax production list name terminal> <anglr syntax production list name> | <anglr syntax production list terminal> <anglr syntax production list> | <anglr syntax production terminal> <anglr syntax production> | <production name terminal> <production name> | <name list terminal> <name list> | <marker list terminal> <marker list> | <marker terminal> <marker> | <g name terminal> <g name> | <name terminal> <name> | <cardinality delimiter terminal> <cardinality delimiter> | <cardinality terminal> <cardinality> | <delimiter terminal> <delimiter> ; } [ Description Hover='true' Text='definition of attributes' ] ANGLR-ATTRIBUTES { [ Description Hover='true' Text='attribute list is nonempty list of attributes' ] <attribute list> : <attribute> + ; [ Description Hover='true' Text='attribute is text between ''['' and '']''. It is composed of' Text='- attribute name' Text='- optional list of name value pairs' ] <attribute> : '[' <identifier> <name value list> ? ']' ; [ Description Hover='true' Text='list of name value pairs is nonempty list of' Text='names and associated values' ] <name value list> : <name value pair> + ; [ Description Hover='true' Text='name value pair consists of' Text='- identifier representing name' Text='- equals sign delimiting name and value' Text='- string representing value associated with name' ] <name value pair> : <identifier> '=' <cstring> ; } [ Description Hover='true' Text='structure of anglr file' ] ANGLR-FILE-STRUCTURE { [ Description Hover='true' Text='this rule describes the syntax of whole anglr file.' Text='Anglr file is an optional list of anglr file parts.' ] <anglr file> : <anglr file part list> ? ; [ Description Hover='true' Text='List of anglr file parts is nonempty list of anglr file parts' ] <anglr file part list> : <anglr file part> + ; [ Description Hover='true' Text='anglr file part is one of:' Text='- general part' Text='- declaration part' Text='- scanner part' Text='- parser part' ] <anglr file part> : <general part> | <declaration part> | <scanner part> | <lexer part> | <parser part> ; } [ Description Hover='true' Text='general part of anglr file' ] GENERAL-PART-OF-ANGLR-FILE { [ Description Hover='true' Text='General part has name and list of attribtes which describe:' Text='- name of resulting assembly' Text='- namespaces for generated classes' Text='- names of generated classes' ] <general part> : <attribute list> ? '%general' <identifier> '%{' <attribute list> ? '%}' ; } [ Description Hover='true' Text='declaration part of anglr file' ] DECLARATION-PART-OF-ANGLR-FILE { [ Description Hover='true' Text='Declaration part consists of:' Text='- optional list of attributes. Attributes for the declaration part do not currently exist' Text='- name for declaration part' Text='- optional list of declarations' ] <declaration part> : <attribute list> ? '%declarations' <identifier> '%{' <anglr definition list> ? '%}' ; [ Description Hover='true' Text='anglr definition list is nonempty list of anglr definitions' ] <anglr definition list> : <anglr definition with attribute> + ; [ Description Hover='true' Text='anglr definition should be preceeded with possibly empty attribute list' ] <anglr definition with attribute> : <attribute list> ? <anglr definition> ; [ Description Hover='true' Text='anglr definition is one of' Text='- single termial declaration' Text='- single regular expression declaration' Text='- block of termial declarations' Text='- block of regular expression declarations' ] <anglr definition> : <single terminal definition> | <single regex definition> | <block of terminal definitions> | <block of regex definitions> ; [ Description Hover='true' Text='single terminal declaration is composed of:' Text='- word %terminal' Text='- followed by definition of terminal symbol' ] <single terminal definition> : '%terminal' <terminal definition> ; [ Description Hover='true' Text='single regular expression declaration is composed of:' Text='- word %regex' Text='- followed by definition of regular expression' ] <single regex definition> : '%regex' <regex definition> ; [ Description Hover='true' Text='block of terminal declarations is composed of:' Text='- word %terminal' Text='- followed by block of terminal symbol definitions enclosed between curly braces' ] <block of terminal definitions> : '%terminal' '{' <block terminal definitions> ? '}' ; [ Description Hover='true' Text='block of regular expression declarations is composed of:' Text='- word %regex' Text='- followed by block of regular expression definitions enclosed between curly braces' ] <block of regex definitions> : '%regex' '{' <block regex definitions> ? '}' ; [ Description Hover='true' Text='terminal symbol definition consists of' Text='- terminal symbol name' Text='- optional string representation of terminal symbol' Text=' name and string representation are interchangable' ] <terminal definition> : <identifier> <cstring> ? ; [ Description Hover='true' Text='regular expression definition consists of' Text='- regular expression name' Text='- string, spanning to the end of line, representing content of regular expression' ] <regex definition> : <identifier> <regular expression> ; [ Description Hover='true' Text='block terminal definitions is list of terminals' ] <block terminal definitions> : <block terminal definition> + ; [ Description Hover='true' Text='block terminal definition consists of' Text='- possible empty attribute list; Description attribute' Text='- terminal specification' ] <block terminal definition> : <attribute list> ? <terminal definition> ; [ Description Hover='true' Text='list of block regex definitions' ] <block regex definitions> : <block regex definition> + ; [ Description Hover='true' Text='block regex definition consists of' Text='- possible empty attribute list' Text='- identifier representing name of regular expression' Text='- character string representing regular expression' ] <block regex definition> : <attribute list> ? <regex definition> ; } [ Description Hover='true' Text='scanner part of anglr file' ] SCANNER-PART-OF-ANGLR-FILE { [ Description Hover='true' Text='scanner part consists of' Text='- optional attribute list. CompilationInfo is currently' Text=' the only attribute used to describe scanner part. This' Text=' attribute describes compiled regular expression associated' Text=' with scanner part' Text='- word %scanner' Text='- identifier representing name of scanner part' Text='- optional list of regular expressions constituting scanner part within %{ and %}' ] <scanner part> : <attribute list> ? '%scanner' <identifier> '%{' <regular expression list> ? '%}' ; [ Description Hover='true' Text='list of regular expressions consists usage specifications of regular expressions' ] <regular expression list> : <regular expression usage> + ; [ Description Hover='true' Text='regular expression usage consists of regular expression followed by possibly empty list of actions' Text='regular expression must be specified at the beginnig of the line' ] <regular expression usage> : <regular expression> <actions> ? ; [ Description Hover='true' Text='list of actions associated with text scanned by scanner using particular regular expression' ] <actions> : <action> + ; [ Description Hover='true' Text='an action associated with text scanned by regular expression.' Text='Skip, terminal and event action are mutually exclusive.' Text='Only one of them, last in the list, is taken in effect.' Text='If there is no skip, terminal or event actions in action list,' Text='skip is assumed. Push and pop actions should be balanced.' Text='During the scanning process there should never be more pop' Text='than push actions. At the end of scanning process number of' Text='push and pop actions should be equal.' Text='' Text='Action list must be specified in lines following regular' Text='expression, with which it is associated. Lines containing' Text='actions must start with at least one space character' ] <action> : <skip action> | <terminal action> | <event action> | <push action> | <pop action> ; [ Description Hover='true' Text='regular expression action: skip text. Skip, terminal' Text='and event actions are mutually exclusive. The last one of' Text='them si taken in effect.' ] <skip action> : 'skip' ; [ Description Hover='true' Text='regular expression action: report terminal code. Skip, terminal' Text='and event actions are mutually exclusive. The last one of' Text='them si taken in effect.' ] <terminal action> : 'terminal' <identifier> ; [ Description Hover='true' Text='regular expression action: fire event associated with scanned text' Text='Handlers for event actions should be specified in source code' Text='associated with scanner. Event actions are used to handle more complex' Text='scenarios, when terminal an skip actions are not enough. If event action' Text='is not handled, skip action is performed. Skip, terminal and event actions' Text='are mutually exclusive. The last one of them si taken in effect.' ] <event action> : 'event' <identifier> ; [ Description Hover='true' Text='regular expression action: activate another scanner' Text='more than one push action should be specified in single action list' ] <push action> : 'push' <identifier> ; [ Description Hover='true' Text='regular expression action: deactivate current scanner' Text='more than one pop action should be specified in single' Text='action list as long as it is balanced with push actions' ] <pop action> : 'pop' ; } [ Description Hover='true' Text='lexer part of anglr file' ] LEXER-PART-OF-ANGLR-FILE { [ Description Hover='true' Text='lexer part consists of attribute list which describes lexical analyzer' ] <lexer part> : <attribute list> ? '%lexer' <identifier> '%{' <attribute list> ? '%}' ; } [ Description Hover='true' Text='parser part of anglr file' ] PARSER-PART-OF-ANGLR-FILE { [ Description Hover='true' Text='parser part consists of' Text='- optional attribute list. Scanner is currently the only' Text=' attribute used to describe parser part. It defines' Text=' id of scanner used in generated parser.' Text='- word %parser' Text='- identifier representing parser name' Text='- optional list of syntax rules enclosed within %{ and %}' ] <parser part> : <attribute list> ? '%parser' <identifier> '%{' <anglr syntax rule list> ? '%}' ; [ Description Hover='true' Text='anglr syntax rule list is nonempty list of syntax rule specifications' ] <anglr syntax rule list> : <anglr syntax rule> + ; [ Description Hover='true' Text='anglr syntax rule specification comes in two flavours. First one is' Text='specification of anglr syntax rule. The second one is something completelly' Text='different but contextually similar: specification of syntax rules grouping.' Text='' Text='First production defines the syntax of anglr syntax rule. It consists of:' Text='- optional attribute list. Currently is recognised only Start attribute' Text=' which should have no parameters' Text='- name of syntax rule' Text='- followed by colon' Text='- syntax production list' Text='- terminated by semicolon' Text='' Text='The second production defines the syntax of grouping. It consists of:' Text='- group name optionally preceeded by attribute list which are currently' Text=' miningless for grouping' Text='- possibly empty list of syntax rules and nested groupings (since syntax' Text=' rule for anglr syntax rule specifies also syntax rule for grouping)' Text=' enclosed with curly braces.' Text='The depth of nesting is thus theoretically unlimited.' ] <anglr syntax rule> : <attribute list> ? <identifier> ':' <anglr syntax production list> ';' | <attribute list> ? <identifier> '{' <anglr syntax rule list> ? '}' ; [ Description Hover='true' Text='Nested anglr syntax production list is used to separate elements in name lists' Text='and to specify more compact forms of syntax rules. Optional name specified' Text='within it, or generated one if this name is not specified, is used to generate' Text='syntax rule for anglr syntax production list specified within it if this list' Text='does not represent unnamed single production.' Text='' Text='Named nested anglr syntax rules should be used exactly the same way as ordinary' Text='syntax rules. Their names should be used as nonterminal symbols in specifications' Text='of arbitrary syntax rules.' Text='' Text='Nested anglr syntax rule pecification is very similar to syntax rule specification itself,' Text='except that its name is optional and specified between two colon signs ('':''). It is always' Text='specified within other syntax rule specifications. They can be nested to an arbitrary depth:' Text='within nested syntax rule there can be any number of other nested syntax rules. In this way' Text='the whole grammar of some language can be specified with single syntax rule composed by' Text='nested rules of arbitrary depth.' Text='' Text='It consists of' Text='- optional name of syntax rule' Text='- specified between colon signs' Text='- syntax production list' Text='- it is not terminated by semicolon' ] <anglr nested rule> : <anglr syntax production list name> ? <anglr syntax production list> ; [ Description Hover='true' Text='name of nested rule is very similar to name of ordinary rule' ] <anglr syntax production list name> : ':' <identifier> ':' ; [ Description Hover='true' Text='syntax production list is nonempty list of syntax productions' Text='delimited with vertical lines' ] <anglr syntax production list> : <anglr syntax production> + [ '|' ] ; [ Description Hover='true' Text='syntax production should be on of' Text='- name list representing nonempty production' Text='- string ''%empty'' representing empty production' Text='production specified with ''%empty'' always produces' Text='empty terminal string. By the contrary, production' Text='represented by name list need not to produce nonempty' Text='terminal string. Every production of syntax rule should' Text='be preceeded with production name' ] <anglr syntax production> : <production name> ? <name list> | '%empty' ; [ Description Hover='true' Text='Production name should be used to give name to any production' Text='of any syntax rule. Exceptions are empty productions which' Text='must not be named. These names are composed with two consecutive' Text='at-signs (@) and an identifier. Different productions of given' Text='syntax rule must have different names. These names are used in' Text='naming conventions for enums of positional markers. If production' Text='has name, enum of positional markers for this production is' Text='concatenation with this name and suffix _markers. If production' Text='has no name, than name for enum of positional markers is composed' Text='with syntax rule name, suffix _markers and relative index of' Text='production starting with 1. See generated code for an example.' ] <production name> : '@@' <identifier> ; [ Description Hover='true' Text='name list is nonempty list of ''marked'' names' ] <name list> : <g name> - [ <marker list> ? ] ; [ Description Hover='true' Text='non-empty list of markers' ] <marker list> : <marker> + ; [ Description Hover='true' Text='Marker is non-syntactical element of production.' Text='It is used to enumerate production nodes. Each marker' Text='is assigned sequence number of production node immediately' Text='following it. Marker names should be different within' Text='given syntax rule. Their names are stored in enumeration' Text='named markers of class associated with this syntax rule.' Text='marker should be given in following form: identifier' Text='preceeded with at-sign @.' ] <marker> : '@' <identifier> ; [ Description Hover='true' Text='''generalized'' name should be one of' Text='- simple name' Text='- nested anglr syntax production list enclosed with ''('' and '')''' Text='- any of above possibilities followd by any number of cardinality spcifications' ] <g name> : <name> | '(' <anglr nested rule> ')' | <g name> <cardinality delimiter> ; [ Description Hover='true' Text='simple name is one of' Text='- any. This case is currently undefined' Text='- string of characters enclosed with single or double apostrophes' Text='- identifier' ] <name> : <any> | <cstring> | <identifier> ; [ Description Hover='true' Text='specification of cardinality is followed by an optional' Text='specification of delimiter between name list elements' ] <cardinality delimiter> : <cardinality> <delimiter> ? ; [ Description Hover='true' Text='cardinality is used to specify how many elements should have set of <g name>s' Text='preceeding it in the specification of <g name>.' Text='Cardinality is one of' Text='- ? non-mandatory element (list consists of mostly one element)' Text='- +, -, ~+ and ~- to create nonempty name list' Text='- *, /, ~* and ~/ to create possibly empty name list' Text='- two optional numbers delimited with comma and enclosed with ''{'' and ''}''' Text=' possible way to specify optional minimal and maximal number of' Text=' element occurances in name list (this case is not yet implemented)' ] <cardinality> : '?' | '+' | '-' | '*' | '/' | '~+' | '~-' | '~*' | '~/' | '{' <number> ? ',' <number> ? '}' ; [ Description Hover='true' Text='nested anglr syntax production list used to separate elements in name list.' Text='Optional name, or generated one if name is not specified, is used to generate' Text='syntax rule for anglr syntax production list if this list does not represent unnamed' Text='single production' ] <delimiter> : '[' <anglr nested rule> ']' ; } %}