progs/lexer/lex.sc
changeset 1011 31e011ce66e3
parent 981 14e5ae1fb541
equal deleted inserted replaced
1010:ae9ffbf979ff 1011:31e011ce66e3
    49   def | (s: Rexp) = ALT(r, s)
    49   def | (s: Rexp) = ALT(r, s)
    50   def % = STAR(r)
    50   def % = STAR(r)
    51   def ~ (s: Rexp) = SEQ(r, s)
    51   def ~ (s: Rexp) = SEQ(r, s)
    52 }
    52 }
    53 
    53 
    54 // to use & for records, instead of $ which had
       
    55 // its precedence be changed in Scala 3
       
    56 
       
    57 val TEST = ("ab" | "ba").%
    54 val TEST = ("ab" | "ba").%
    58 
    55 
    59 def nullable(r: Rexp) : Boolean = r match {
    56 def nullable(r: Rexp) : Boolean = r match {
    60   case ZERO => false
    57   case ZERO => false
    61   case ONE => true
    58   case ONE => true
   146 
   143 
   147 println(lex(STAR("aa" | "a"), "aaa".toList))
   144 println(lex(STAR("aa" | "a"), "aaa".toList))
   148 
   145 
   149 println(lex(STAR(STAR("a")), "aaa".toList))
   146 println(lex(STAR(STAR("a")), "aaa".toList))
   150 
   147 
   151 val re = ("a" | "ab") ~ ("c" | "bc")
       
   152 
       
   153 println(pders1("abc", re).toList.mkString("\n"))
       
   154 pders('a', pder('a', re))))
       
   155 draw(simp(der('a', der('a', der('a', re)))))
       
   156 
       
   157 size(simp(ders(, re)))
       
   158 size(simp(der('a', der('a', re))))
       
   159 size(simp(der('a', der('a', der('a', re)))))
       
   160 
       
   161 
       
   162 lex(re, "aaaaa".toList)
       
   163 
   148 
   164 // The Lexing Rules for the WHILE Language
   149 // The Lexing Rules for the WHILE Language
   165 
   150 
   166 def PLUS(r: Rexp) = r ~ r.%
   151 def PLUS(r: Rexp) = r ~ r.%
   167 
   152 
   188 enum TAGS {
   173 enum TAGS {
   189   case Key, Id, Op, Num, Semi, Str, Paren, Wht
   174   case Key, Id, Op, Num, Semi, Str, Paren, Wht
   190 }
   175 }
   191 import TAGS._
   176 import TAGS._
   192 
   177 
       
   178 
   193 extension (t: TAGS) {
   179 extension (t: TAGS) {
   194   def & (r: Rexp) = RECD[TAGS](t, r)
   180   def $ (r: Rexp) = RECD[TAGS](t, r)
   195 }
   181 }
   196 
   182 
   197 def lexing(r: Rexp, s: String) = 
   183 def lexing(r: Rexp, s: String) = 
   198   env[TAGS](lex(r, s.toList))
   184   env[TAGS](lex(r, s.toList))
   199 
   185 
   200 val WHILE_REGS = ((Key & KEYWORD) | 
   186 val WHILE_REGS = ((Key $ KEYWORD) | 
   201                   (Id & ID) | 
   187                   (Id $ ID) | 
   202                   (Op & OP) | 
   188                   (Op $ OP) | 
   203                   (Num & NUM) | 
   189                   (Num $ NUM) | 
   204                   (Semi & SEMI) | 
   190                   (Semi $ SEMI) | 
   205                   (Str & STRING) |
   191                   (Str $ STRING) |
   206                   (Paren & (LPAREN | RPAREN)) | 
   192                   (Paren $ (LPAREN | RPAREN)) | 
   207                   (Wht & WHITESPACE)).%
   193                   (Wht $ WHITESPACE)).%
   208 
   194 
   209 
   195 
   210 // Two Simple While Tests
   196 // Two Simple While Tests
   211 //========================
   197 //========================
   212  
   198