1*d219b4ceSAdam Hornacek/* 2*d219b4ceSAdam Hornacek * CDDL HEADER START 3*d219b4ceSAdam Hornacek * 4*d219b4ceSAdam Hornacek * The contents of this file are subject to the terms of the 5*d219b4ceSAdam Hornacek * Common Development and Distribution License (the "License"). 6*d219b4ceSAdam Hornacek * You may not use this file except in compliance with the License. 7*d219b4ceSAdam Hornacek * 8*d219b4ceSAdam Hornacek * See LICENSE.txt included in this distribution for the specific 9*d219b4ceSAdam Hornacek * language governing permissions and limitations under the License. 10*d219b4ceSAdam Hornacek * 11*d219b4ceSAdam Hornacek * When distributing Covered Code, include this CDDL HEADER in each 12*d219b4ceSAdam Hornacek * file and include the License file at LICENSE.txt. 13*d219b4ceSAdam Hornacek * If applicable, add the following below this CDDL HEADER, with the 14*d219b4ceSAdam Hornacek * fields enclosed by brackets "[]" replaced with your own identifying 15*d219b4ceSAdam Hornacek * information: Portions Copyright [yyyy] [name of copyright owner] 16*d219b4ceSAdam Hornacek * 17*d219b4ceSAdam Hornacek * CDDL HEADER END 18*d219b4ceSAdam Hornacek */ 19*d219b4ceSAdam Hornacek 20*d219b4ceSAdam Hornacek/* 21*d219b4ceSAdam Hornacek * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. 22*d219b4ceSAdam Hornacek * Portions Copyright (c) 2017, Chris Fraire <cfraire@me.com>. 23*d219b4ceSAdam Hornacek */ 24*d219b4ceSAdam Hornacek 25*d219b4ceSAdam HornacekIdentifier = {Symbol} 26*d219b4ceSAdam Hornacek 27*d219b4ceSAdam HornacekNumber = ({NumberLong} | {NumberDecimal} | {NumberSci} | {NumberHex} | 28*d219b4ceSAdam Hornacek {NumberBinary} | {NumberCrazy} | {NumberRatio}) 29*d219b4ceSAdam HornacekNumberLong = [\-\+]?[0-9]+ 30*d219b4ceSAdam HornacekNumberDecimal = [\-\+]?[0-9]*\.[0-9]+ 31*d219b4ceSAdam HornacekNumberSci = ({NumberLong} | {NumberDecimal}) ([eE][+-]?[0-9]+)? 32*d219b4ceSAdam HornacekNumberHex = 0[Xx][0-9A-Fa-f]+ 33*d219b4ceSAdam HornacekNumberBinary = 2[Rr][01]+ 34*d219b4ceSAdam HornacekNumberCrazy = 36[Rr][0-9A-Za-z]+ 35*d219b4ceSAdam HornacekNumberRatio = {NumberLong}"/"{NumberLong} 36*d219b4ceSAdam Hornacek 37*d219b4ceSAdam Hornacek/* 38*d219b4ceSAdam Hornacek * Symbols 39*d219b4ceSAdam Hornacek * 40*d219b4ceSAdam Hornacek * Symbols begin with a non-numeric character and can contain alphanumeric 41*d219b4ceSAdam Hornacek * characters and *, +, !, -, _, ', and ? (other characters may be allowed 42*d219b4ceSAdam Hornacek * eventually). 43*d219b4ceSAdam Hornacek * 44*d219b4ceSAdam Hornacek * N.b. under "Macro Characters", the Quote (') macro is defined -- and that 45*d219b4ceSAdam Hornacek * section implies that Symbols cannot begin with \' 46*d219b4ceSAdam Hornacek */ 47*d219b4ceSAdam HornacekSymbol = ({SymbolNormal} | {SymbolSlashed} | {SymbolDotted} | {SymbolColon}) 48*d219b4ceSAdam HornacekSymbolNormal = {SymCharLead} {SymCharAny}* 49*d219b4ceSAdam HornacekSymCharSpecial = [\*\+\!\-_\'\?] 50*d219b4ceSAdam HornacekSymCharLead = ([A-Za-z] | [[\*\+\!\-_\'\?]--\']) // i.e. [{SymCharSpecial}--\'] 51*d219b4ceSAdam HornacekSymCharAlphanum = [A-Za-z0-9] 52*d219b4ceSAdam HornacekSymCharAny = ({SymCharAlphanum} | {SymCharSpecial}) 53*d219b4ceSAdam Hornacek/* 54*d219b4ceSAdam Hornacek * '/' has special meaning, it can be used once in the middle of a symbol to 55*d219b4ceSAdam Hornacek * separate the namespace from the name, e.g. my-namespace/foo. '/' by itself 56*d219b4ceSAdam Hornacek * names the division function. 57*d219b4ceSAdam Hornacek */ 58*d219b4ceSAdam HornacekSymbolSlashed = {SymbolNormal} "/" {SymCharAny}+ 59*d219b4ceSAdam Hornacek/* 60*d219b4ceSAdam Hornacek * '.' has special meaning - it can be used one or more times in the middle of 61*d219b4ceSAdam Hornacek * a symbol to designate a fully-qualified class name, e.g. java.util.BitSet, 62*d219b4ceSAdam Hornacek * or in namespace names. Symbols beginning or ending with '.' are reserved by 63*d219b4ceSAdam Hornacek * Clojure. Symbols containing / or . are said to be 'qualified'. 64*d219b4ceSAdam Hornacek */ 65*d219b4ceSAdam HornacekSymbolDotted = {SymbolNormal} ("." {SymCharAny}+)+ 66*d219b4ceSAdam Hornacek/* 67*d219b4ceSAdam Hornacek * Symbols beginning or ending with ':' are reserved by Clojure. A symbol can 68*d219b4ceSAdam Hornacek * contain one or more non-repeating ':'s. 69*d219b4ceSAdam Hornacek */ 70*d219b4ceSAdam HornacekSymbolColon = (":" {SymCharAny}+ ":"? | {SymCharAny}+ ":") 71