src/Pure/General/symbol.scala
changeset 34134 d8d9df8407f6
parent 34098 2b9cdf23c188
child 34137 6cc9a0cbaf55
equal deleted inserted replaced
34133:17554065f3be 34134:d8d9df8407f6
    34   {
    34   {
    35     val len = s.length
    35     val len = s.length
    36     len == 1 && Character.isHighSurrogate(s.charAt(0)) ||
    36     len == 1 && Character.isHighSurrogate(s.charAt(0)) ||
    37     s == "\\" ||
    37     s == "\\" ||
    38     s == "\\<" ||
    38     s == "\\<" ||
    39     len > 2 && s.charAt(len - 1) != '>'
    39     len > 2 && s.charAt(len - 1) != '>'   // FIXME bad_symbol !??
    40   }
    40   }
    41 
    41 
    42 
    42 
    43   /* elements */
    43   /* elements */
    44 
    44 
    45   private def could_open(c: Char): Boolean =
    45   def could_open(c: Char): Boolean =
    46     c == '\\' || Character.isHighSurrogate(c)
    46     c == '\\' || Character.isHighSurrogate(c)
    47 
    47 
    48   def elements(text: CharSequence) = new Iterator[String] {
    48   def elements(text: CharSequence) = new Iterator[String]
       
    49   {
    49     private val matcher = regex.pattern.matcher(text)
    50     private val matcher = regex.pattern.matcher(text)
    50     private var i = 0
    51     private var i = 0
    51     def hasNext = i < text.length
    52     def hasNext = i < text.length
    52     def next = {
    53     def next = {
    53       val len =
    54       val len =
   183         yield read_decl(decl)
   184         yield read_decl(decl)
   184 
   185 
   185 
   186 
   186     /* misc properties */
   187     /* misc properties */
   187 
   188 
   188     val names: Map[String, String] = {
   189     val names: Map[String, String] =
       
   190     {
   189       val name = new Regex("""\\<([A-Za-z][A-Za-z0-9_']*)>""")
   191       val name = new Regex("""\\<([A-Za-z][A-Za-z0-9_']*)>""")
   190       Map((for ((sym @ name(a), _) <- symbols) yield (sym -> a)): _*)
   192       Map((for ((sym @ name(a), _) <- symbols) yield (sym -> a)): _*)
   191     }
   193     }
   192 
   194 
   193     val abbrevs: Map[String, String] = Map((
   195     val abbrevs: Map[String, String] = Map((
   214        new Recoder(mapping map { case (x, y) => (y, x) }))
   216        new Recoder(mapping map { case (x, y) => (y, x) }))
   215     }
   217     }
   216 
   218 
   217     def decode(text: String): String = decoder.recode(text)
   219     def decode(text: String): String = decoder.recode(text)
   218     def encode(text: String): String = encoder.recode(text)
   220     def encode(text: String): String = encoder.recode(text)
       
   221 
       
   222 
       
   223     /* classification */
       
   224 
       
   225     private val raw_letters = Set(
       
   226       "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
       
   227       "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
       
   228       "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
       
   229       "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
       
   230 
       
   231       "\\<A>", "\\<B>", "\\<C>", "\\<D>", "\\<E>", "\\<F>", "\\<G>",
       
   232       "\\<H>", "\\<I>", "\\<J>", "\\<K>", "\\<L>", "\\<M>", "\\<N>",
       
   233       "\\<O>", "\\<P>", "\\<Q>", "\\<R>", "\\<S>", "\\<T>", "\\<U>",
       
   234       "\\<V>", "\\<W>", "\\<X>", "\\<Y>", "\\<Z>", "\\<a>", "\\<b>",
       
   235       "\\<c>", "\\<d>", "\\<e>", "\\<f>", "\\<g>", "\\<h>", "\\<i>",
       
   236       "\\<j>", "\\<k>", "\\<l>", "\\<m>", "\\<n>", "\\<o>", "\\<p>",
       
   237       "\\<q>", "\\<r>", "\\<s>", "\\<t>", "\\<u>", "\\<v>", "\\<w>",
       
   238       "\\<x>", "\\<y>", "\\<z>",
       
   239 
       
   240       "\\<AA>", "\\<BB>", "\\<CC>", "\\<DD>", "\\<EE>", "\\<FF>",
       
   241       "\\<GG>", "\\<HH>", "\\<II>", "\\<JJ>", "\\<KK>", "\\<LL>",
       
   242       "\\<MM>", "\\<NN>", "\\<OO>", "\\<PP>", "\\<QQ>", "\\<RR>",
       
   243       "\\<SS>", "\\<TT>", "\\<UU>", "\\<VV>", "\\<WW>", "\\<XX>",
       
   244       "\\<YY>", "\\<ZZ>", "\\<aa>", "\\<bb>", "\\<cc>", "\\<dd>",
       
   245       "\\<ee>", "\\<ff>", "\\<gg>", "\\<hh>", "\\<ii>", "\\<jj>",
       
   246       "\\<kk>", "\\<ll>", "\\<mm>", "\\<nn>", "\\<oo>", "\\<pp>",
       
   247       "\\<qq>", "\\<rr>", "\\<ss>", "\\<tt>", "\\<uu>", "\\<vv>",
       
   248       "\\<ww>", "\\<xx>", "\\<yy>", "\\<zz>",
       
   249 
       
   250       "\\<alpha>", "\\<beta>", "\\<gamma>", "\\<delta>", "\\<epsilon>",
       
   251       "\\<zeta>", "\\<eta>", "\\<theta>", "\\<iota>", "\\<kappa>",
       
   252       "\\<mu>", "\\<nu>", "\\<xi>", "\\<pi>", "\\<rho>", "\\<sigma>",
       
   253       "\\<tau>", "\\<upsilon>", "\\<phi>", "\\<chi>", "\\<psi>",
       
   254       "\\<omega>", "\\<Gamma>", "\\<Delta>", "\\<Theta>", "\\<Lambda>",
       
   255       "\\<Xi>", "\\<Pi>", "\\<Sigma>", "\\<Upsilon>", "\\<Phi>",
       
   256       "\\<Psi>", "\\<Omega>",
       
   257 
       
   258       "\\<^isub>", "\\<^isup>")
       
   259 
       
   260     private val letters = raw_letters ++ raw_letters.map(decode(_))
       
   261 
       
   262     def is_letter(sym: String): Boolean = letters.contains(sym)
       
   263 
       
   264     def is_digit(sym: String): Boolean =
       
   265       if (sym.length == 1) {
       
   266         val c = sym(0)
       
   267         '0' <= c && c <= '9'
       
   268       }
       
   269       else false
       
   270 
       
   271     def is_quasi(sym: String): Boolean = sym == "_" || sym == "'"
       
   272 
       
   273 
       
   274     private val raw_blanks =
       
   275       Set(" ", "\t", "\n", "\u000B", "\f", "\r", "\\<spacespace>", "\\<^newline>")
       
   276     private val blanks = raw_blanks ++ raw_blanks.map(decode(_))
       
   277 
       
   278     def is_blank(sym: String): Boolean = blanks.contains(sym)
   219   }
   279   }
   220 }
   280 }