mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			888 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			888 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
 @license{
 | 
						|
  Copyright (c) 2009-2015 CWI
 | 
						|
  All rights reserved. This program and the accompanying materials
 | 
						|
  are made available under the terms of the Eclipse Public License v1.0
 | 
						|
  which accompanies this distribution, and is available at
 | 
						|
  http://www.eclipse.org/legal/epl-v10.html
 | 
						|
}
 | 
						|
@contributor{Jurgen J. Vinju - Jurgen.Vinju@cwi.nl - CWI}
 | 
						|
@contributor{Tijs van der Storm - Tijs.van.der.Storm@cwi.nl}
 | 
						|
@contributor{Paul Klint - Paul.Klint@cwi.nl - CWI}
 | 
						|
@contributor{Arnold Lankamp - Arnold.Lankamp@cwi.nl}
 | 
						|
@contributor{Michael Steindorfer - Michael.Steindorfer@cwi.nl - CWI}
 | 
						|
@doc{The syntax definition of Rascal, excluding concrete syntax fragments}
 | 
						|
module lang::rascal::\syntax::Rascal
 | 
						|
 | 
						|
lexical BooleanLiteral
 | 
						|
	= "true" 
 | 
						|
	| "false" ;
 | 
						|
 | 
						|
syntax Literal
 | 
						|
	= integer: IntegerLiteral integerLiteral 
 | 
						|
	| regExp: RegExpLiteral regExpLiteral 
 | 
						|
	| \real: RealLiteral realLiteral 
 | 
						|
	| boolean: BooleanLiteral booleanLiteral 
 | 
						|
	| string: StringLiteral stringLiteral 
 | 
						|
	| dateTime: DateTimeLiteral dateTimeLiteral 
 | 
						|
	| location: LocationLiteral locationLiteral
 | 
						|
	| rational: RationalLiteral rationalLiteral
 | 
						|
	;
 | 
						|
 | 
						|
syntax Expression = concrete: Concrete concrete;
 | 
						|
syntax Pattern    = concrete: Concrete concrete;
 | 
						|
 | 
						|
lexical Concrete 
 | 
						|
  = typed: "(" LAYOUTLIST l1 Sym symbol LAYOUTLIST l2 ")" LAYOUTLIST l3 "`" ConcretePart* parts "`";
 | 
						|
 | 
						|
lexical ConcretePart
 | 
						|
  = @category="MetaSkipped" text   : ![`\<\>\\\n]+ !>> ![`\<\>\\\n]
 | 
						|
  | newline: "\n" [\ \t \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000]* "\'"
 | 
						|
  | @category="MetaVariable" hole : ConcreteHole hole
 | 
						|
  | @category="MetaSkipped" lt: "\\\<"
 | 
						|
  | @category="MetaSkipped" gt: "\\\>"
 | 
						|
  | @category="MetaSkipped" bq: "\\`"
 | 
						|
  | @category="MetaSkipped" bs: "\\\\"
 | 
						|
  ;
 | 
						|
  
 | 
						|
syntax ConcreteHole 
 | 
						|
  = \one: "\<" Sym symbol Name name "\>"
 | 
						|
  ;
 | 
						|
  
 | 
						|
start syntax Module
 | 
						|
	= \default: Header header Body body ;
 | 
						|
 | 
						|
syntax ModuleParameters
 | 
						|
	= \default: "[" {TypeVar ","}+ parameters "]" ;
 | 
						|
 | 
						|
lexical DateAndTime
 | 
						|
	= "$" DatePart "T" TimePartNoTZ !>> [+\-] "$"
 | 
						|
	| "$" DatePart "T" TimePartNoTZ TimeZonePart "$";
 | 
						|
 | 
						|
syntax Strategy
 | 
						|
	= topDownBreak: "top-down-break" 
 | 
						|
	| topDown: "top-down" 
 | 
						|
	| bottomUp: "bottom-up" 
 | 
						|
	| bottomUpBreak: "bottom-up-break" 
 | 
						|
	| outermost: "outermost" 
 | 
						|
	| innermost: "innermost" ;
 | 
						|
 | 
						|
lexical UnicodeEscape
 | 
						|
	  = utf16: "\\" [u] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] 
 | 
						|
    | utf32: "\\" [U] (("0" [0-9 A-F a-f]) | "10") [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] // 24 bits 
 | 
						|
    | ascii: "\\" [a] [0-7] [0-9A-Fa-f]
 | 
						|
    ;
 | 
						|
    
 | 
						|
syntax Variable
 | 
						|
	= initialized: Name name "=" Expression initial 
 | 
						|
	| unInitialized: Name name ;
 | 
						|
 | 
						|
lexical OctalIntegerLiteral
 | 
						|
	= [0] [0-7]+ !>> [0-9 A-Z _ a-z] ;
 | 
						|
 | 
						|
syntax TypeArg
 | 
						|
	= \default: Type type 
 | 
						|
	| named: Type type Name name ;
 | 
						|
 | 
						|
syntax Renaming
 | 
						|
	= \default: Name from "=\>" Name to ;
 | 
						|
 | 
						|
syntax Catch
 | 
						|
	= \default: "catch" ":" Statement body 
 | 
						|
	| binding: "catch" Pattern pattern ":" Statement body ;
 | 
						|
 | 
						|
lexical PathChars
 | 
						|
	= URLChars [|] ;
 | 
						|
 | 
						|
syntax Signature
 | 
						|
	= withThrows: FunctionModifiers modifiers Type type  Name name Parameters parameters "throws" {Type ","}+ exceptions 
 | 
						|
	| noThrows: FunctionModifiers modifiers Type type  Name name Parameters parameters ;
 | 
						|
 | 
						|
syntax Sym
 | 
						|
// named non-terminals
 | 
						|
	= nonterminal: Nonterminal nonterminal !>> "["
 | 
						|
	| parameter: "&" Nonterminal nonterminal 
 | 
						|
	| parametrized: Nonterminal nonterminal >> "[" "[" {Sym ","}+ parameters "]"
 | 
						|
	| \start: "start" "[" Nonterminal nonterminal "]"
 | 
						|
	| labeled: Sym symbol NonterminalLabel label
 | 
						|
// literals 
 | 
						|
	| characterClass: Class charClass 
 | 
						|
	| literal: StringConstant string 
 | 
						|
	| caseInsensitiveLiteral: CaseInsensitiveStringConstant cistring
 | 
						|
// regular expressions
 | 
						|
	| iter: Sym symbol "+" 
 | 
						|
	| iterStar: Sym symbol "*" 
 | 
						|
	| iterSep: "{" Sym symbol Sym sep "}" "+" 
 | 
						|
	| iterStarSep: "{" Sym symbol Sym sep "}" "*" 
 | 
						|
	| optional: Sym symbol "?" 
 | 
						|
	| alternative: "(" Sym first "|" {Sym "|"}+ alternatives ")"
 | 
						|
	| sequence: "(" Sym first Sym+ sequence ")"
 | 
						|
	// TODO: MinimalIter: Sym symbol IntegerConstant minimal "+"
 | 
						|
	// TODO: MinimalIterSep: "{" Sym symbol Symbol sep "}" IntegerConstant minimal "+"
 | 
						|
	// TODO | Permutation: "(" Sym first "~" {Sym "~"}+ participants ")"
 | 
						|
	// TODO | Combination: "(" Sym first "#" {Sym "#"}+ elements ")"
 | 
						|
	| empty: "(" ")"
 | 
						|
// conditionals
 | 
						|
	| column: Sym symbol "@" IntegerLiteral column 
 | 
						|
	| endOfLine: Sym symbol "$" 
 | 
						|
	| startOfLine: "^" Sym symbol
 | 
						|
	| except:   Sym symbol "!" NonterminalLabel label
 | 
						|
	>  
 | 
						|
	assoc ( 
 | 
						|
	  left  ( follow:     Sym symbol  "\>\>" Sym match
 | 
						|
	        | notFollow:  Sym symbol "!\>\>" Sym match
 | 
						|
	        )
 | 
						|
	  | 
 | 
						|
	  right ( precede:    Sym match "\<\<" Sym symbol 
 | 
						|
	        | notPrecede: Sym match "!\<\<" Sym symbol
 | 
						|
	        )
 | 
						|
	)
 | 
						|
	> 
 | 
						|
	left unequal:  Sym symbol "\\" Sym match
 | 
						|
	;
 | 
						|
 | 
						|
lexical TimePartNoTZ
 | 
						|
	= [0-2] [0-9] [0-5] [0-9] [0-5] [0-9] ([, .] [0-9] ([0-9] [0-9]?)?)? 
 | 
						|
	| [0-2] [0-9] ":" [0-5] [0-9] ":" [0-5] [0-9] ([, .] [0-9] ([0-9] [0-9]?)?)? 
 | 
						|
	;
 | 
						|
 | 
						|
syntax Header
 | 
						|
	= parameters: Tags tags "module" QualifiedName name ModuleParameters params Import* imports 
 | 
						|
	| \default: Tags tags "module" QualifiedName name Import* imports ;
 | 
						|
 | 
						|
lexical Name
 | 
						|
    // Names are surrounded by non-alphabetical characters, i.e. we want longest match.
 | 
						|
	=  ([A-Z a-z _] !<< [A-Z _ a-z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z]) \ RascalKeywords 
 | 
						|
	| [\\] [A-Z _ a-z] [\- 0-9 A-Z _ a-z]* !>> [\- 0-9 A-Z _ a-z] 
 | 
						|
	;
 | 
						|
 | 
						|
syntax SyntaxDefinition
 | 
						|
	=  @Foldable \layout  : Visibility vis "layout"  Sym defined "=" Prod production ";" 
 | 
						|
	|  @Foldable \lexical : "lexical" Sym defined "=" Prod production ";" 
 | 
						|
	|  @Foldable \keyword : "keyword" Sym defined "=" Prod production ";"
 | 
						|
	|  @Foldable language: Start start "syntax" Sym defined "=" Prod production ";" ;
 | 
						|
 | 
						|
syntax Kind
 | 
						|
	= function: "function" 
 | 
						|
	| variable: "variable" 
 | 
						|
	| \all: "all" 
 | 
						|
	| \anno: "anno" 
 | 
						|
	| \data: "data" 
 | 
						|
	| view: "view" 
 | 
						|
	| \alias: "alias" 
 | 
						|
	| \module: "module" 
 | 
						|
	| \tag: "tag" ;
 | 
						|
 | 
						|
syntax ImportedModule
 | 
						|
	= \default: QualifiedName name 
 | 
						|
	| actualsRenaming: QualifiedName name ModuleActuals actuals Renamings renamings 
 | 
						|
	| renamings: QualifiedName name Renamings renamings 
 | 
						|
	| actuals: QualifiedName name ModuleActuals actuals 
 | 
						|
	;
 | 
						|
 | 
						|
syntax Target
 | 
						|
	= empty: 
 | 
						|
	| labeled: Name name ;
 | 
						|
 | 
						|
syntax IntegerLiteral
 | 
						|
	= /*prefer()*/ decimalIntegerLiteral: DecimalIntegerLiteral decimal 
 | 
						|
	| /*prefer()*/ hexIntegerLiteral: HexIntegerLiteral hex 
 | 
						|
	| /*prefer()*/ octalIntegerLiteral: OctalIntegerLiteral octal ;
 | 
						|
 | 
						|
syntax FunctionBody
 | 
						|
	= \default: "{" Statement* statements "}" ;
 | 
						|
    
 | 
						|
syntax Expression
 | 
						|
	= nonEmptyBlock  : "{" Statement+ statements "}" 
 | 
						|
	| bracket \bracket: "(" Expression expression ")" 
 | 
						|
	| closure        : Type type Parameters parameters "{" Statement+ statements "}" 
 | 
						|
	| stepRange      : "[" Expression first "," Expression second ".." Expression last "]" 
 | 
						|
	| voidClosure    : Parameters parameters "{" Statement* statements0 "}" 
 | 
						|
	| \visit          : Label label Visit visit 
 | 
						|
	| reducer        : "(" Expression init "|" Expression result "|" {Expression ","}+ generators ")" 
 | 
						|
	| reifiedType    : "type" "(" Expression symbol "," Expression definitions ")"  
 | 
						|
	| callOrTree     : Expression!transitiveClosure!transitiveReflexiveClosure!isDefined expression "(" {Expression ","}* arguments KeywordArguments[Expression] keywordArguments ")"
 | 
						|
	| literal        : Literal literal 
 | 
						|
	| \any            : "any" "(" {Expression ","}+ generators ")" 
 | 
						|
	| \all            : "all" "(" {Expression ","}+ generators ")" 
 | 
						|
	| comprehension  : Comprehension comprehension 
 | 
						|
	| \set            : "{" {Expression ","}* elements0 "}" 
 | 
						|
	| \list           : "[" {Expression ","}* elements0 "]"
 | 
						|
	| reifyType      : "#" Type type !>> "[" !selector
 | 
						|
	| range          : "[" Expression first ".." Expression last "]"
 | 
						|
	| \tuple          : "\<" {Expression ","}+ elements "\>" 
 | 
						|
	| \map            : "(" {Mapping[Expression] ","}* mappings ")" 
 | 
						|
	| \it             : [A-Z a-z _] !<< "it" !>> [A-Z a-z _]
 | 
						|
	| qualifiedName  : QualifiedName qualifiedName 
 | 
						|
	| subscript    : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "[" {Expression ","}+ subscripts "]"
 | 
						|
	| slice        : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "[" OptionalExpression optFirst ".." OptionalExpression optLast "]" 
 | 
						|
    | sliceStep    : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "[" OptionalExpression optFirst "," Expression second ".." OptionalExpression optLast "]" 
 | 
						|
	| fieldAccess  : Expression expression "." Name field 
 | 
						|
	| fieldUpdate  : Expression expression "[" Name key "=" Expression replacement "]" 
 | 
						|
	| fieldProject : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "\<" {Field ","}+ fields "\>" 
 | 
						|
	| setAnnotation: Expression expression "[" "@" Name name "=" Expression value "]" 
 | 
						|
    | getAnnotation: Expression expression >> "@" "@" Name name 
 | 
						|
	| is           : Expression expression "is" Name name
 | 
						|
	| has          : Expression expression "has" Name name
 | 
						|
	| transitiveClosure: Expression argument "+" !>> "="
 | 
						|
    | transitiveReflexiveClosure: Expression argument "*" !>> "=" 
 | 
						|
	> isDefined    : Expression argument "?" 
 | 
						|
	> negation     : "!" Expression!match!noMatch argument 
 | 
						|
	| negative     : "-" Expression argument 
 | 
						|
	| non-assoc splice : "*" Expression argument
 | 
						|
	| asType       : "[" Type type "]" Expression!match!noMatch argument
 | 
						|
	> left composition: Expression lhs "o" Expression rhs 
 | 
						|
	> left ( product: Expression lhs "*" () !>> "*" Expression!noMatch!match rhs  
 | 
						|
		   | \join   : Expression lhs "join" Expression rhs 
 | 
						|
	       | remainder: Expression lhs "%" Expression rhs
 | 
						|
		   | division: Expression lhs "/" Expression rhs 
 | 
						|
	     )
 | 
						|
	> left intersection: Expression lhs "&" !>> "&" Expression rhs 
 | 
						|
	> left ( addition   : Expression lhs "+" Expression!noMatch!match rhs  
 | 
						|
		   | subtraction: Expression!transitiveClosure!transitiveReflexiveClosure lhs "-" Expression rhs
 | 
						|
		   | appendAfter: Expression lhs "\<\<" !>> "=" Expression rhs
 | 
						|
		   | insertBefore: Expression lhs "\>\>" Expression rhs 
 | 
						|
	       )
 | 
						|
	> left modulo: Expression lhs "mod" Expression rhs
 | 
						|
	> non-assoc ( notIn: Expression lhs "notin" Expression rhs  
 | 
						|
		        | \in: Expression lhs "in" Expression rhs 
 | 
						|
	)
 | 
						|
	> non-assoc ( greaterThanOrEq: Expression lhs "\>=" Expression rhs  
 | 
						|
		        | lessThanOrEq   : Expression lhs "\<=" Expression rhs 
 | 
						|
		        | lessThan       : Expression lhs "\<" !>> "-" Expression rhs 
 | 
						|
		        | greaterThan    : Expression lhs "\>" Expression rhs 
 | 
						|
	            )
 | 
						|
	> non-assoc ( equals         : Expression lhs "==" Expression rhs
 | 
						|
	            | nonEquals      : Expression lhs "!=" Expression rhs 
 | 
						|
	            )
 | 
						|
	> non-assoc ifDefinedOtherwise: Expression lhs "?" Expression rhs
 | 
						|
	> non-assoc ( noMatch: Pattern pattern "!:=" Expression expression  
 | 
						|
		        | match: Pattern pattern ":=" Expression expression 
 | 
						|
		        | enumerator: Pattern pattern "\<-" Expression expression 
 | 
						|
	            ) 
 | 
						|
	> non-assoc ( implication: Expression lhs "==\>" Expression rhs  
 | 
						|
		        | equivalence: Expression lhs "\<==\>" Expression rhs 
 | 
						|
	            )
 | 
						|
	> left and: Expression lhs "&&" Expression rhs 
 | 
						|
	> left or: Expression lhs "||" Expression rhs 
 | 
						|
	> right ifThenElse: Expression condition "?" Expression thenExp ":" Expression elseExp
 | 
						|
	; 
 | 
						|
 | 
						|
syntax OptionalExpression 
 | 
						|
  = expression: Expression expression
 | 
						|
  | noExpression: ()
 | 
						|
  ;
 | 
						|
    
 | 
						|
syntax UserType
 | 
						|
	= name: QualifiedName name 
 | 
						|
	| parametric: QualifiedName name >> "[" "[" {Type ","}+ parameters "]" ;
 | 
						|
 | 
						|
syntax Import
 | 
						|
	= \extend: "extend" ImportedModule module ";" 
 | 
						|
	| \default: "import" ImportedModule module ";"
 | 
						|
	| \external: "import" QualifiedName name "=" LocationLiteral at ";"
 | 
						|
	| \syntax: SyntaxDefinition syntax ;
 | 
						|
 | 
						|
syntax Body
 | 
						|
	= toplevels: Toplevel* toplevels ;
 | 
						|
 | 
						|
lexical URLChars
 | 
						|
	= ![\t-\n \r \  \< |]* ;
 | 
						|
 | 
						|
lexical TimeZonePart
 | 
						|
	= [+ \-] [0-1] [0-9] ":" [0-5] [0-9] 
 | 
						|
	| "Z" 
 | 
						|
	| [+ \-] [0-1] [0-9] 
 | 
						|
	| [+ \-] [0-1] [0-9] [0-5] [0-9] 
 | 
						|
	;
 | 
						|
 | 
						|
syntax ProtocolPart
 | 
						|
	= nonInterpolated: ProtocolChars protocolChars 
 | 
						|
	| interpolated: PreProtocolChars pre Expression expression ProtocolTail tail ;
 | 
						|
 | 
						|
syntax StringTemplate
 | 
						|
	= ifThen    : "if"    "(" {Expression ","}+ conditions ")" "{" Statement* preStats StringMiddle body Statement* postStats "}" 
 | 
						|
	| ifThenElse: "if"    "(" {Expression ","}+ conditions ")" "{" Statement* preStatsThen StringMiddle thenString Statement* postStatsThen "}" "else" "{" Statement* preStatsElse StringMiddle elseString Statement* postStatsElse "}" 
 | 
						|
	| \for       : "for"   "(" {Expression ","}+ generators ")" "{" Statement* preStats StringMiddle body Statement* postStats "}" 
 | 
						|
	| doWhile   : "do"    "{" Statement* preStats StringMiddle body Statement* postStats "}" "while" "(" Expression condition ")" 
 | 
						|
	| \while     : "while" "(" Expression condition ")" "{" Statement* preStats StringMiddle body Statement* postStats "}" ;
 | 
						|
 | 
						|
lexical PreStringChars
 | 
						|
	= @category="Constant" [\"] StringCharacter* [\<] ;
 | 
						|
 | 
						|
lexical CaseInsensitiveStringConstant
 | 
						|
	= @category="Constant" "\'" StringCharacter* chars "\'" ;
 | 
						|
 | 
						|
lexical Backslash
 | 
						|
	= [\\] !>> [/ \< \> \\] ;
 | 
						|
 | 
						|
syntax Label
 | 
						|
	= \default: Name name ":" 
 | 
						|
	| empty: ;
 | 
						|
 | 
						|
lexical MidProtocolChars
 | 
						|
	= "\>" URLChars "\<" ;
 | 
						|
 | 
						|
lexical NamedBackslash
 | 
						|
	= [\\] !>> [\< \> \\] ;
 | 
						|
 | 
						|
syntax Field
 | 
						|
	= index: IntegerLiteral fieldIndex 
 | 
						|
	| name: Name fieldName ;
 | 
						|
 | 
						|
lexical JustDate
 | 
						|
	= "$" DatePart "$";
 | 
						|
 | 
						|
lexical PostPathChars
 | 
						|
	=  "\>" URLChars "|" ;
 | 
						|
 | 
						|
syntax PathPart
 | 
						|
	= nonInterpolated: PathChars pathChars 
 | 
						|
	| interpolated: PrePathChars pre Expression expression PathTail tail ;
 | 
						|
 | 
						|
lexical DatePart
 | 
						|
	= [0-9] [0-9] [0-9] [0-9] "-" [0-1] [0-9] "-" [0-3] [0-9] 
 | 
						|
	| [0-9] [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [0-9] ;
 | 
						|
 | 
						|
syntax FunctionModifier
 | 
						|
	= java: "java" 
 | 
						|
	| \test: "test" 
 | 
						|
	| \default: "default";
 | 
						|
 | 
						|
syntax Assignment
 | 
						|
	= ifDefined: "?=" 
 | 
						|
	| division: "/=" 
 | 
						|
	| product: "*=" 
 | 
						|
	| intersection: "&=" 
 | 
						|
	| subtraction: "-=" 
 | 
						|
	| \default: "=" 
 | 
						|
	| addition: "+=" 
 | 
						|
	| \append: "\<\<="
 | 
						|
	;
 | 
						|
 | 
						|
syntax Assignable
 | 
						|
	= bracket \bracket   : "(" Assignable arg ")"
 | 
						|
	| variable          : QualifiedName qualifiedName
 | 
						|
    | subscript         : Assignable receiver "[" Expression subscript "]" 
 | 
						|
    | slice             : Assignable receiver "[" OptionalExpression optFirst ".." OptionalExpression optLast "]" 
 | 
						|
    | sliceStep         : Assignable receiver "[" OptionalExpression optFirst "," Expression second ".." OptionalExpression optLast "]"     
 | 
						|
	| fieldAccess       : Assignable receiver "." Name field 
 | 
						|
	| ifDefinedOrDefault: Assignable receiver "?" Expression defaultExpression 
 | 
						|
	| constructor       : Name name "(" {Assignable ","}+ arguments ")"  
 | 
						|
	| \tuple             : "\<" {Assignable ","}+ elements "\>" 
 | 
						|
	| annotation        : Assignable receiver "@" Name annotation  ;
 | 
						|
 | 
						|
lexical StringConstant
 | 
						|
	= @category="Constant" "\"" StringCharacter* chars "\"" ;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
syntax Assoc
 | 
						|
	= associative: "assoc" 
 | 
						|
	| left: "left" 
 | 
						|
	| nonAssociative: "non-assoc" 
 | 
						|
	| right: "right" ;
 | 
						|
 | 
						|
syntax Replacement
 | 
						|
	= unconditional: Expression replacementExpression 
 | 
						|
	| conditional: Expression replacementExpression "when" {Expression ","}+ conditions ;
 | 
						|
 | 
						|
syntax DataTarget
 | 
						|
	= empty: 
 | 
						|
	| labeled: Name label ":" ;
 | 
						|
 | 
						|
lexical StringCharacter
 | 
						|
	= "\\" [\" \' \< \> \\ b f n r t] 
 | 
						|
	| UnicodeEscape 
 | 
						|
	| ![\" \' \< \> \\]
 | 
						|
	| [\n][\ \t \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000]* [\'] // margin 
 | 
						|
	;
 | 
						|
 | 
						|
lexical JustTime
 | 
						|
	= "$T" TimePartNoTZ !>> [+\-] "$"
 | 
						|
	| "$T" TimePartNoTZ TimeZonePart "$"
 | 
						|
	;
 | 
						|
 | 
						|
lexical MidStringChars
 | 
						|
	= @category="Constant" [\>] StringCharacter* [\<] ;
 | 
						|
 | 
						|
lexical ProtocolChars
 | 
						|
	= [|] URLChars "://" !>> [\t-\n \r \ \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000];
 | 
						|
 | 
						|
lexical RegExpModifier
 | 
						|
	= [d i m s]* ;
 | 
						|
 | 
						|
syntax CommonKeywordParameters 
 | 
						|
  = absent: ()
 | 
						|
  | present: "(" {KeywordFormal ","}+ keywordFormalList ")"
 | 
						|
  ;
 | 
						|
    
 | 
						|
syntax Parameters
 | 
						|
	= \default: "(" Formals formals KeywordFormals keywordFormals ")" 
 | 
						|
	| varArgs: "(" Formals formals "..." KeywordFormals keywordFormals ")" ;
 | 
						|
 | 
						|
lexical OptionalComma = \default: ","? ;
 | 
						|
 | 
						|
syntax KeywordFormals
 | 
						|
    = \default: OptionalComma optionalComma [,\ (\t\n] << {KeywordFormal ","}+ keywordFormalList
 | 
						|
    | none: ()
 | 
						|
    ;
 | 
						|
    
 | 
						|
syntax KeywordFormal 
 | 
						|
    = \default: Type type Name name "=" Expression expression
 | 
						|
    ;
 | 
						|
    
 | 
						|
syntax KeywordArguments[&T]
 | 
						|
    = \default:  OptionalComma optionalComma [,\ (\t\n] << {KeywordArgument[&T] ","}+ keywordArgumentList
 | 
						|
    | none: ()
 | 
						|
    ;
 | 
						|
    
 | 
						|
syntax KeywordArgument[&T] = \default: Name name "=" &T expression ;
 | 
						|
 | 
						|
lexical RegExp
 | 
						|
	= ![/ \< \> \\] 
 | 
						|
	| "\<" Name "\>" 
 | 
						|
	| [\\] [/ \< \> \\] 
 | 
						|
	| "\<" Name ":" NamedRegExp* "\>" 
 | 
						|
	| Backslash 
 | 
						|
	// | @category="MetaVariable" [\<]  Expression expression [\>] TODO: find out why this production existed 
 | 
						|
	;
 | 
						|
	
 | 
						|
 | 
						|
layout LAYOUTLIST
 | 
						|
	= LAYOUT* !>> [\u0009-\u000D \u0020 \u0085 \u00A0 \u1680 \u180E \u2000-\u200A \u2028 \u2029 \u202F \u205F \u3000] !>> "//" !>> "/*";
 | 
						|
 | 
						|
syntax LocalVariableDeclaration
 | 
						|
	= \default: Declarator declarator 
 | 
						|
	| \dynamic: "dynamic" Declarator declarator ;
 | 
						|
 | 
						|
lexical RealLiteral
 | 
						|
	= [0-9]+ [D F d f] 
 | 
						|
	| [0-9]+ [E e] [+ \-]? [0-9]+ [D F d f]?
 | 
						|
	| [0-9]+ "." !>> "." [0-9]* [D F d f]?  
 | 
						|
	| [0-9]+ "." [0-9]* [E e] [+ \-]? [0-9]+ [D F d f]? 
 | 
						|
	| [.] !<< "." [0-9]+ [D F d f]? 
 | 
						|
	| [.] !<< "." [0-9]+ [E e] [+ \-]? [0-9]+ [D F d f]? 
 | 
						|
	;
 | 
						|
 | 
						|
syntax Range
 | 
						|
	= fromTo: Char start "-" Char end 
 | 
						|
	| character: Char character ;
 | 
						|
 | 
						|
syntax LocationLiteral
 | 
						|
	= \default: ProtocolPart protocolPart PathPart pathPart ;
 | 
						|
 | 
						|
syntax ShellCommand
 | 
						|
	= setOption: "set" QualifiedName name Expression expression 
 | 
						|
	| undeclare: "undeclare" QualifiedName name 
 | 
						|
	| help: "help" 
 | 
						|
	| edit: "edit" QualifiedName name 
 | 
						|
	| unimport: "unimport" QualifiedName name 
 | 
						|
	| listDeclarations: "declarations" 
 | 
						|
	| quit: "quit" 
 | 
						|
	| history: "history" 
 | 
						|
	| \test: "test" 
 | 
						|
	| listModules: "modules" 
 | 
						|
	| clear: "clear";
 | 
						|
 | 
						|
syntax StringMiddle
 | 
						|
	= mid: MidStringChars mid 
 | 
						|
	| template: MidStringChars mid StringTemplate template StringMiddle tail 
 | 
						|
	| interpolated: MidStringChars mid Expression expression StringMiddle tail ;
 | 
						|
 | 
						|
syntax QualifiedName
 | 
						|
	= \default: {Name "::"}+ names !>> "::" ;
 | 
						|
 | 
						|
lexical RationalLiteral
 | 
						|
   = [0-9][0-9]* [r]
 | 
						|
   | [1-9][0-9]* [r] [0-9][0-9]* !>> [0-9 A-Z _ a-z]
 | 
						|
   ;
 | 
						|
 | 
						|
lexical DecimalIntegerLiteral
 | 
						|
	= "0" !>> [0-9 A-Z _ a-z] 
 | 
						|
	| [1-9] [0-9]* !>> [0-9 A-Z _ a-z] ;
 | 
						|
 | 
						|
syntax DataTypeSelector
 | 
						|
	= selector: QualifiedName sort "." Name production ;
 | 
						|
 | 
						|
syntax StringTail
 | 
						|
	= midInterpolated: MidStringChars mid Expression expression StringTail tail 
 | 
						|
	| post: PostStringChars post 
 | 
						|
	| midTemplate: MidStringChars mid StringTemplate template StringTail tail ;
 | 
						|
 | 
						|
syntax PatternWithAction
 | 
						|
	= replacing: Pattern pattern "=\>" Replacement replacement 
 | 
						|
	| arbitrary: Pattern pattern ":" Statement statement ;
 | 
						|
 | 
						|
lexical LAYOUT
 | 
						|
	= Comment 
 | 
						|
	// all the white space chars defined in Unicode 6.0 
 | 
						|
	| [\u0009-\u000D \u0020 \u0085 \u00A0 \u1680 \u180E \u2000-\u200A \u2028 \u2029 \u202F \u205F \u3000] 
 | 
						|
	;
 | 
						|
 | 
						|
syntax Visit
 | 
						|
	= givenStrategy: Strategy strategy "visit" "(" Expression subject ")" "{" Case+ cases "}" 
 | 
						|
	| defaultStrategy: "visit" "(" Expression subject ")" "{" Case+ cases "}" ;
 | 
						|
 | 
						|
start syntax Commands
 | 
						|
	= \commandlist: EvalCommand+ commands
 | 
						|
	;
 | 
						|
 | 
						|
start syntax EvalCommand
 | 
						|
  = declaration: Declaration declaration  
 | 
						|
  | statement: Statement!variableDeclaration!functionDeclaration!visit statement 
 | 
						|
  | \import: Import imported
 | 
						|
  | output: Output
 | 
						|
  ;
 | 
						|
 
 | 
						|
lexical Output   
 | 
						|
  = @category="Result" resultOutput: "⇨" ![\n\r]* [\n] 
 | 
						|
  | @category="StdOut" stdoutOutput: ^ "≫" ![\n\r]* [\n]
 | 
						|
  | @category="StdErr" stderrOutput: ^ "⚠" ![\n\r]* [\n]
 | 
						|
  ;
 | 
						|
  
 | 
						|
start syntax Command
 | 
						|
	= expression: Expression!nonEmptyBlock expression 
 | 
						|
	| declaration: Declaration declaration 
 | 
						|
	| shell: ":" ShellCommand command 
 | 
						|
	| statement: Statement!variableDeclaration!functionDeclaration!visit statement 
 | 
						|
	| \import: Import imported ;
 | 
						|
 | 
						|
lexical TagString
 | 
						|
	= "\\" !<< "{" ( ![{}] | ("\\" [{}]) | TagString)* contents "\\" !<< "}";
 | 
						|
 | 
						|
syntax ProtocolTail
 | 
						|
	= mid: MidProtocolChars mid Expression expression ProtocolTail tail 
 | 
						|
	| post: PostProtocolChars post ;
 | 
						|
 | 
						|
lexical Nonterminal
 | 
						|
	= ([A-Z] !<< [A-Z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z]) \ RascalKeywords;
 | 
						|
 | 
						|
syntax PathTail
 | 
						|
	= mid: MidPathChars mid Expression expression PathTail tail 
 | 
						|
	| post: PostPathChars post ;
 | 
						|
 | 
						|
syntax Visibility
 | 
						|
	= \private: "private" 
 | 
						|
	| \default: 
 | 
						|
	| \public: "public" ;
 | 
						|
 | 
						|
syntax StringLiteral
 | 
						|
	= template: PreStringChars pre StringTemplate template StringTail tail 
 | 
						|
	| interpolated: PreStringChars pre Expression expression StringTail tail 
 | 
						|
	| nonInterpolated: StringConstant constant ;
 | 
						|
 | 
						|
lexical Comment
 | 
						|
	= @category="Comment" "/*" (![*] | [*] !>> [/])* "*/" 
 | 
						|
	| @category="Comment" "//" ![\n]* !>> [\ \t\r \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000] $ // the restriction helps with parsing speed
 | 
						|
	;
 | 
						|
	
 | 
						|
 | 
						|
syntax Renamings
 | 
						|
	= \default: "renaming" {Renaming ","}+ renamings ;
 | 
						|
 | 
						|
syntax Tags
 | 
						|
	= \default: Tag* tags ;
 | 
						|
 | 
						|
syntax Formals
 | 
						|
	= \default: {Pattern ","}* formals ;
 | 
						|
 | 
						|
lexical PostProtocolChars
 | 
						|
	= "\>" URLChars "://" ;
 | 
						|
 | 
						|
syntax Start
 | 
						|
	= absent: 
 | 
						|
	| present: "start" ;
 | 
						|
 | 
						|
syntax Statement
 | 
						|
	= @breakable \assert: "assert" Expression expression ";" 
 | 
						|
	| @breakable assertWithMessage: "assert" Expression expression ":" Expression message ";" 
 | 
						|
	| @breakable expression: Expression!visit!nonEmptyBlock expression ";" 
 | 
						|
	| @breakable \visit: Label label Visit visit 
 | 
						|
	| @breakable \while: Label label "while" "(" {Expression ","}+ conditions ")" Statement!variableDeclaration!functionDeclaration body 
 | 
						|
	| @breakable doWhile: Label label "do" Statement body "while" "(" Expression condition ")" ";" 
 | 
						|
	| @breakable @breakable{generators} \for: Label label "for" "(" {Expression ","}+ generators ")" Statement body 
 | 
						|
	| @breakable ifThen: Label label "if" "(" {Expression ","}+ conditions ")" Statement!variableDeclaration!functionDeclaration thenStatement () !>> "else" 
 | 
						|
	| @breakable ifThenElse: Label label "if" "(" {Expression ","}+ conditions ")" Statement thenStatement "else" Statement!variableDeclaration!functionDeclaration elseStatement 
 | 
						|
	| @breakable \switch: Label label "switch" "(" Expression expression ")" "{" Case+ cases "}" 
 | 
						|
	| @breakable \fail: "fail" Target target ";" 
 | 
						|
	| @breakable \break: "break" Target target ";" 
 | 
						|
	| @breakable \continue: "continue" Target target ";" 
 | 
						|
    | @breakable \filter: "filter" ";"
 | 
						|
	| @breakable \solve: "solve" "(" {QualifiedName ","}+ variables Bound bound ")" Statement!variableDeclaration!functionDeclaration body 
 | 
						|
	| @breakable non-assoc \try: "try" Statement body Catch+ handlers 
 | 
						|
	| @breakable tryFinally: "try" Statement body Catch+ handlers "finally" Statement!variableDeclaration!functionDeclaration finallyBody 
 | 
						|
	| nonEmptyBlock: Label label "{" Statement+ statements "}" 
 | 
						|
	| emptyStatement: ";" 
 | 
						|
	| @breakable globalDirective: "global" Type type {QualifiedName ","}+ names ";" 
 | 
						|
	| @breakable assignment: Assignable assignable Assignment operator Statement!functionDeclaration!variableDeclaration statement
 | 
						|
	| non-assoc  ( 
 | 
						|
		          @breakable \return    : "return" Statement!functionDeclaration!variableDeclaration statement  
 | 
						|
		        | @breakable \throw     : "throw" Statement!functionDeclaration!variableDeclaration statement 
 | 
						|
		        | @breakable \insert    : "insert" DataTarget dataTarget Statement!functionDeclaration!variableDeclaration statement 
 | 
						|
		        | @breakable \append    : "append" DataTarget dataTarget Statement!functionDeclaration!variableDeclaration statement 
 | 
						|
	            )
 | 
						|
    | @breakable functionDeclaration: FunctionDeclaration functionDeclaration 
 | 
						|
	| @breakable variableDeclaration: LocalVariableDeclaration declaration ";"
 | 
						|
	; 
 | 
						|
	
 | 
						|
    
 | 
						|
syntax StructuredType
 | 
						|
	= \default: BasicType basicType "[" {TypeArg ","}+ arguments "]" ;
 | 
						|
 | 
						|
lexical NonterminalLabel
 | 
						|
	= [a-z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z] ;
 | 
						|
 | 
						|
syntax FunctionType
 | 
						|
	= typeArguments: Type type "(" {TypeArg ","}* arguments ")" ;
 | 
						|
 | 
						|
syntax Case
 | 
						|
	= @Foldable patternWithAction: "case" PatternWithAction patternWithAction 
 | 
						|
	| @Foldable \default: "default" ":" Statement statement ;
 | 
						|
 | 
						|
syntax Declarator
 | 
						|
	= \default: Type type {Variable ","}+ variables ;
 | 
						|
 | 
						|
syntax Bound
 | 
						|
	= \default: ";" Expression expression 
 | 
						|
	| empty: ;
 | 
						|
 | 
						|
keyword RascalKeywords
 | 
						|
	= "o"
 | 
						|
	| "syntax"
 | 
						|
	| "keyword"
 | 
						|
	| "lexical"
 | 
						|
	| "int"
 | 
						|
	| "break"
 | 
						|
	| "continue"
 | 
						|
	| "rat" 
 | 
						|
	| "true" 
 | 
						|
	| "bag" 
 | 
						|
	| "num" 
 | 
						|
	| "node" 
 | 
						|
	| "finally" 
 | 
						|
	| "private" 
 | 
						|
	| "real" 
 | 
						|
	| "list" 
 | 
						|
	| "fail" 
 | 
						|
	| "filter" 
 | 
						|
	| "if" 
 | 
						|
	| "tag" 
 | 
						|
	| BasicType
 | 
						|
	| "extend" 
 | 
						|
	| "append" 
 | 
						|
	| "rel" 
 | 
						|
	| "lrel"
 | 
						|
	| "void" 
 | 
						|
	| "non-assoc" 
 | 
						|
	| "assoc" 
 | 
						|
	| "test" 
 | 
						|
	| "anno" 
 | 
						|
	| "layout" 
 | 
						|
	| "data" 
 | 
						|
	| "join" 
 | 
						|
	| "it" 
 | 
						|
	| "bracket" 
 | 
						|
	| "in" 
 | 
						|
	| "import" 
 | 
						|
	| "false" 
 | 
						|
	| "all" 
 | 
						|
	| "dynamic" 
 | 
						|
	| "solve" 
 | 
						|
	| "type" 
 | 
						|
	| "try" 
 | 
						|
	| "catch" 
 | 
						|
	| "notin" 
 | 
						|
	| "else" 
 | 
						|
	| "insert" 
 | 
						|
	| "switch" 
 | 
						|
	| "return" 
 | 
						|
	| "case" 
 | 
						|
	| "while" 
 | 
						|
	| "str" 
 | 
						|
	| "throws" 
 | 
						|
	| "visit" 
 | 
						|
	| "tuple" 
 | 
						|
	| "for" 
 | 
						|
	| "assert" 
 | 
						|
	| "loc" 
 | 
						|
	| "default" 
 | 
						|
	| "map" 
 | 
						|
	| "alias" 
 | 
						|
	| "any" 
 | 
						|
	| "module" 
 | 
						|
	| "mod"
 | 
						|
	| "bool" 
 | 
						|
	| "public" 
 | 
						|
	| "one" 
 | 
						|
	| "throw" 
 | 
						|
	| "set" 
 | 
						|
	| "start"
 | 
						|
	| "datetime" 
 | 
						|
	| "value" 
 | 
						|
	;
 | 
						|
 | 
						|
syntax Type
 | 
						|
	= bracket \bracket: "(" Type type ")" 
 | 
						|
	| user: UserType user
 | 
						|
	| function: FunctionType function 
 | 
						|
	| structured: StructuredType structured 
 | 
						|
	| basic: BasicType basic 
 | 
						|
	| selector: DataTypeSelector selector 
 | 
						|
	| variable: TypeVar typeVar 
 | 
						|
	| symbol: Sym!nonterminal!labeled!parametrized!parameter symbol
 | 
						|
	;
 | 
						|
 | 
						|
syntax Declaration
 | 
						|
	= variable    : Tags tags Visibility visibility Type type {Variable ","}+ variables ";" 
 | 
						|
	| annotation  : Tags tags Visibility visibility "anno" Type annoType Type onType "@" Name name ";" 
 | 
						|
	| \alias       : Tags tags Visibility visibility "alias" UserType user "=" Type base ";" 
 | 
						|
	| \tag         : Tags tags Visibility visibility "tag" Kind kind Name name "on" {Type ","}+ types ";" 
 | 
						|
	| dataAbstract: Tags tags Visibility visibility "data" UserType user CommonKeywordParameters commonKeywordParameters ";" 
 | 
						|
	| @Foldable \data : Tags tags Visibility visibility "data" UserType user CommonKeywordParameters commonKeywordParameters"=" {Variant "|"}+ variants ";"
 | 
						|
	| function       : FunctionDeclaration functionDeclaration 
 | 
						|
	;
 | 
						|
 | 
						|
syntax Class
 | 
						|
	= simpleCharclass: "[" Range* ranges "]" 
 | 
						|
	| complement: "!" Class charClass 
 | 
						|
	> left difference: Class lhs "-" Class rhs 
 | 
						|
	> left intersection: Class lhs "&&" Class rhs 
 | 
						|
	> left union: Class lhs "||" Class rhs 
 | 
						|
	| bracket \bracket: "(" Class charclass ")" ;
 | 
						|
 | 
						|
lexical RegExpLiteral
 | 
						|
	= "/" RegExp* "/" RegExpModifier ;
 | 
						|
 | 
						|
syntax FunctionModifiers
 | 
						|
	= \modifierlist: FunctionModifier* modifiers ;
 | 
						|
 | 
						|
syntax Comprehension
 | 
						|
	= @breakable{results,generators} \set: "{" {Expression ","}+ results "|" {Expression ","}+ generators "}" 
 | 
						|
	| @breakable{from,to,generators} \map: "(" Expression from ":" Expression to "|" {Expression ","}+ generators ")" 
 | 
						|
	| @breakable{results,generators} \list: "[" {Expression ","}+ results "|" {Expression ","}+ generators "]" ;
 | 
						|
 | 
						|
syntax Variant
 | 
						|
	= nAryConstructor: Name name "(" {TypeArg ","}* arguments  KeywordFormals keywordArguments ")" ;
 | 
						|
 | 
						|
syntax FunctionDeclaration
 | 
						|
	= abstract: Tags tags Visibility visibility Signature signature ";" 
 | 
						|
	| @Foldable @breakable{expression} expression: Tags tags Visibility visibility Signature signature "=" Expression expression ";"
 | 
						|
	| @Foldable @breakable{expression,conditions} conditional: Tags tags Visibility visibility Signature signature "=" Expression expression "when" {Expression ","}+ conditions ";"
 | 
						|
	| @Foldable \default: Tags tags Visibility visibility Signature signature FunctionBody body ;
 | 
						|
 | 
						|
lexical PreProtocolChars
 | 
						|
	= "|" URLChars "\<" ;
 | 
						|
 | 
						|
lexical NamedRegExp
 | 
						|
	= "\<" Name "\>" 
 | 
						|
	| [\\] [/ \< \> \\] 
 | 
						|
	| NamedBackslash 
 | 
						|
	| ![/ \< \> \\] ;
 | 
						|
 | 
						|
syntax ProdModifier
 | 
						|
	= associativity: Assoc associativity 
 | 
						|
	| \bracket: "bracket" 
 | 
						|
	| \tag: Tag tag;
 | 
						|
 | 
						|
syntax Toplevel
 | 
						|
	= givenVisibility: Declaration declaration ;
 | 
						|
 | 
						|
lexical PostStringChars
 | 
						|
	= @category="Constant" [\>] StringCharacter* [\"] ;
 | 
						|
 | 
						|
lexical HexIntegerLiteral
 | 
						|
	= [0] [X x] [0-9 A-F a-f]+ !>> [0-9 A-Z _ a-z] ;
 | 
						|
 | 
						|
syntax TypeVar
 | 
						|
	= free: "&" Name name 
 | 
						|
	| bounded: "&" Name name "\<:" Type bound ;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
syntax BasicType
 | 
						|
	= \value: "value" 
 | 
						|
	| \loc: "loc" 
 | 
						|
	| \node: "node" 
 | 
						|
	| \num: "num" 
 | 
						|
	| \type: "type" 
 | 
						|
	| \bag: "bag" 
 | 
						|
	| \int: "int"
 | 
						|
	| rational: "rat" 
 | 
						|
	| relation: "rel" 
 | 
						|
	| listRelation: "lrel"
 | 
						|
	| \real: "real" 
 | 
						|
	| \tuple: "tuple" 
 | 
						|
	| string: "str" 
 | 
						|
	| \bool: "bool" 
 | 
						|
	| \void: "void" 
 | 
						|
	| dateTime: "datetime" 
 | 
						|
	| \set: "set" 
 | 
						|
	| \map: "map" 
 | 
						|
	| \list: "list" 
 | 
						|
	;
 | 
						|
 | 
						|
lexical Char
 | 
						|
	= @category="Constant" "\\" [\  \" \' \- \< \> \[ \\ \] b f n r t] 
 | 
						|
	| @category="Constant" ![\  \" \' \- \< \> \[ \\ \]] 
 | 
						|
	| @category="Constant" UnicodeEscape 
 | 
						|
    ; 
 | 
						|
    
 | 
						|
syntax Prod
 | 
						|
	= reference: ":" Name referenced
 | 
						|
	| labeled: ProdModifier* modifiers Name name ":" Sym* syms 
 | 
						|
	| others: "..." 
 | 
						|
	| unlabeled: ProdModifier* modifiers Sym* syms
 | 
						|
	| @Foldable associativityGroup: Assoc associativity "(" Prod group ")" 
 | 
						|
	// | TODO add bracket rule for easy readability
 | 
						|
	> left \all   : Prod lhs "|" Prod rhs 
 | 
						|
	> left first : Prod lhs "\>" !>> "\>" Prod rhs
 | 
						|
	;
 | 
						|
 | 
						|
syntax DateTimeLiteral
 | 
						|
	= /*prefer()*/ dateLiteral: JustDate date 
 | 
						|
	| /*prefer()*/ timeLiteral: JustTime time 
 | 
						|
	| /*prefer()*/ dateAndTimeLiteral: DateAndTime dateAndTime ;
 | 
						|
 | 
						|
lexical PrePathChars
 | 
						|
	= URLChars "\<" ;
 | 
						|
 | 
						|
syntax Mapping[&T]
 | 
						|
	= \default: &T!ifDefinedOtherwise from ":" &T to 
 | 
						|
	;
 | 
						|
 | 
						|
lexical MidPathChars
 | 
						|
	= "\>" URLChars "\<" ;
 | 
						|
 | 
						|
/*
 | 
						|
  Note that Pattern must closely follow the definitions of Expression because eventually
 | 
						|
  these two non-terminals will be fused just before AST generation.
 | 
						|
*/
 | 
						|
syntax Pattern
 | 
						|
	= \set                 : "{" {Pattern ","}* elements0 "}" 
 | 
						|
	| \list                : "[" {Pattern ","}* elements0 "]" 
 | 
						|
	| qualifiedName       : QualifiedName qualifiedName 
 | 
						|
	| multiVariable       : QualifiedName qualifiedName "*"
 | 
						|
	| splice              : "*" Pattern argument
 | 
						|
	| splicePlus          : "+" Pattern argument 
 | 
						|
	| negative            : "-" Pattern argument
 | 
						|
	| literal             : Literal literal 
 | 
						|
	| \tuple               : "\<" {Pattern ","}+ elements "\>" 
 | 
						|
	| typedVariable       : Type type Name name 
 | 
						|
	| \map                 : "(" {Mapping[Pattern] ","}* mappings ")" 
 | 
						|
	| reifiedType         : "type" "(" Pattern symbol "," Pattern definitions ")" 
 | 
						|
	| callOrTree          : Pattern expression "(" {Pattern ","}* arguments KeywordArguments[Pattern] keywordArguments ")" 
 | 
						|
	> variableBecomes     : Name name ":" Pattern pattern
 | 
						|
	| asType              : "[" Type type "]" Pattern argument 
 | 
						|
	| descendant          : "/" Pattern pattern 
 | 
						|
	| anti                : "!" Pattern pattern 
 | 
						|
	| typedVariableBecomes: Type type Name name ":" Pattern pattern 
 | 
						|
    ;
 | 
						|
    
 | 
						|
syntax Tag
 | 
						|
	= @Folded @category="Comment" \default   : "@" Name name TagString contents 
 | 
						|
	| @Folded @category="Comment" empty     : "@" Name name 
 | 
						|
	| @Folded @category="Comment" expression: "@" Name name "=" Expression expression !>> "@";
 | 
						|
 | 
						|
syntax ModuleActuals
 | 
						|
	= \default: "[" {Type ","}+ types "]" ;
 |