slex
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. #!/bin/sh
  2. #
  3. # slex - generate simple lex description from transition table
  4. #
  5. # Copyright 1984-1991 Wind River Systems, Inc.
  6. #
  7. # modification history
  8. # --------------------
  9. # 02a,10dec90,gae  changed TINY to "signed char".
  10. #
  11. #
  12. # SYNOPSIS
  13. # .CS
  14. # slex file.slex >file.c
  15. # .CE
  16. #
  17. # DESCRIPTION
  18. # The input file <file.slex> is parsed to generate a C program
  19. # that does lexical analysis according to the original table.
  20. #*/
  21. tool=`basename $0`
  22. prog=/tmp/$tool.$$
  23. #trap "rm -f $prog; exit 1" 0 1 2 3 15
  24. cat <<'EOF' >$prog
  25. # slex.awk - awk program to generate small-lex tables
  26. #
  27. # The following arrays are accumulated during the processing of the slex input
  28. # file:
  29. #   array [index] = value (source of definition)
  30. #   ---------------------------   --------------------- ----------------------
  31. #   final [final-state-name] = final-state-number (final state table)
  32. #   finalDef [final-state-number] = final-state-def-line(final state table)
  33. #   classDef [class-name] = class-definition-line (char class table)
  34. #   classList  = list-of-class-names (state table 1st line)
  35. #   state [state-name] = state-number (state tbl other lines)
  36. #   stateDef [state-number] = state-definition-line (state tbl other lines)
  37. #
  38. # The state of the scan is held in the variable "s" and can have the following 
  39. # values:
  40. #   init - looking for table definitions
  41. #   fs - processing "final state" table
  42. #   cc - processing "char classes" table
  43. #   st - processing "state table" 1st line
  44. #   st2 - processing "state table" subsequent lines
  45. BEGIN {
  46. s = "init"
  47. nstates = 0
  48. nfinals = 0
  49. ascii = " !"#$%&'()*+,-./0123456789:;<=>?@" 
  50. "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`" 
  51. "abcdefghijklmnopqrstuvwxyz{|}~"
  52. }
  53. /^14/ { next } # eat formfeeds
  54. /^ *$/ { next } # eat blank lines
  55. s == "init" {
  56. # look for start of table definitions
  57. # print forward declarations of tables immediately
  58. if ($0 ~ /FINAL STATES:/)
  59.     s = "fs"
  60. else if ($0 ~ /CHAR CLASSES:/)
  61.     {
  62.     print "int lexNclasses;"
  63.     # XXX "signed" only in ANSI
  64.     #print "signed char lexClass [];"
  65.     s = "cc"
  66.     }
  67. else if ($0 ~ /STATE TABLE:/)
  68.     {
  69.     # XXX "signed" only in ANSI
  70.     #print "signed char lexStateTable [];"
  71.     s = "st"
  72.     }
  73. else if ($0 ~ /EJECT:/)
  74.     s = "ej"
  75. else
  76.     print # pass through everything else
  77. next
  78. }
  79. /^ */*/ { next } # eat comment lines inside table definitions
  80. s == "fs" { # FINAL STATES
  81. if ($0 ~ /^END/)
  82.     {
  83.     s = "init"
  84.     next
  85.     }
  86. # get final state info
  87. nfinals++
  88. final [$1] = nfinals
  89. finalDef [nfinals] = $0
  90. next
  91. }
  92. s == "st" { # 1st line of STATE TABLE is char class list
  93. classList = $0
  94. s = "st2"
  95. next
  96. }
  97. s == "st2" { # other lines of STATE TABLE are transitions
  98. if ($0 ~ /^END/)
  99.     {
  100.     s = "init"
  101.     next
  102.     }
  103. # get state name and state transitions
  104. state [$1] = nstates
  105. stateDef [nstates] = $0
  106. nstates++
  107. next
  108. }
  109. s == "cc" { # CHAR CLASS definitions
  110. if ($0 ~ /^END/)
  111.     {
  112.     s = "init"
  113.     next
  114.     }
  115. # associate class definition with name
  116. classDef [$1] = $0
  117. next
  118. }
  119. s == "ej" {
  120. # print action routine with case for each final state
  121. print "int lexActions (state, string, nChars, pContinue)"
  122. print "    int state; char *string; int nChars; BOOL*pContinue;"
  123. print "    {"
  124. print "    *pContinue = FALSE;"
  125. print "    switch (state)"
  126. print "        {"
  127. for (i = 1; i <= nfinals; i++)
  128.     {
  129.     c = index (finalDef[i], "{")
  130.     if (c == 0)
  131. print "ERROR: final state missing "{":n" finalDef[i]
  132.     else
  133. {
  134. print "        case " i ":"
  135. print "            " substr (finalDef[i], c) " break;"
  136. }
  137.     }
  138. print "        }"
  139. print "    *pContinue = TRUE;"
  140. print "    return (0);"
  141. print "    }"
  142. # compute the char class table
  143. nclasses = split (classList, class)
  144. for (i = 2; i <= nclasses; i++)
  145.     {
  146.     clNum = i - 1
  147.     # if class name was defined in CHAR CLASSES, 
  148.     #   get each sub-def into "word" array; 
  149.     #   otherwise just get class name into word[2].
  150.     #   (note: 1st word of classDef is class name itself)
  151.     if (classDef [class[i]] != "")
  152. nwords = split (classDef [class[i]], word)
  153.     else
  154. {
  155. nwords = 2
  156. word[2] = class[i]
  157. }
  158.     # interpret each sub-definition: fill in class table
  159.     for (w = 2; w <= nwords; w++)
  160. {
  161. cl = word[w]
  162. n = -2
  163. if (length (cl) == 1)
  164.     n = index (ascii, cl) + 31 # single character
  165. else if (cl == "EOF")
  166.     n = -1 # special EOF
  167. else if (cl == "EOS")
  168.     n = 0 # string terminator
  169. else if (cl == "\t")
  170.     n = 9 # tab
  171. else if (cl == "\n")
  172.     n = 10 # newline
  173. else if (cl == "SP")
  174.     n = 32 # space
  175. else if (cl ~ /^^/)
  176.     n = index (ascii, substr (cl, 2)) - 33   # ctrl char
  177. else if ((length (cl) == 3) && 
  178.  (substr (cl, 2, 1) == "-"))
  179.     {
  180.     # character range
  181.     n1 = index (ascii, substr (cl, 1, 1)) + 31
  182.     n2 = index (ascii, substr (cl, 3, 1)) + 31
  183.     for (j = n1; j <= n2; j++)
  184. clTbl[j] = clNum
  185.     }
  186. else
  187.     print "ERROR: unrecognized class definition: " cl
  188. if (n != -2)
  189.     clTbl[n] = clNum
  190. }
  191.     }
  192. # print the class table
  193. print "nint lexNclasses = " nclasses ";"
  194. print "nsigned char lexClass [] ="
  195. print "    {"
  196. printf "    " clTbl [-1] ","
  197. for (i = 0; i <= 127; i++)
  198.     {
  199.     if ((i % 16) == 0)
  200. printf "n    "
  201.     printf "%2d, ", clTbl[i]
  202.     }
  203. print "n    };"
  204. # print out state table
  205. print "nsigned char lexStateTable [] ="
  206. print "    {"
  207. for (i = 0; i < nstates; i++)
  208.     {
  209.     # break state table line into individual state transitions
  210.     # (note: first word of stateDef line is state name)
  211.     n = split (stateDef [i], word)
  212.     if (n != (nclasses + 1))
  213. print "ERROR: wrong number of transitions for state " i
  214.     # look-up and printout each state name
  215.     printf "    "
  216.     for (j = 2; j <= n; j++)
  217. {
  218. if (word[j] == ".")
  219.     printf "%2d,", i # same state
  220. else if (final [word[j]] != "")
  221.     printf "-%d,", final [word[j]]      # final state
  222. else if (state [word[j]] != "")
  223.     printf "%2d,", state [word[j]] # trans state
  224. else
  225.     print "nunknown state: " word[j] # unknown state
  226. }
  227.     printf "n"
  228.     }
  229. print "    };"
  230. s = "init"
  231. next
  232. }
  233. EOF
  234. awk -f $prog $*
  235. rm -f $prog
  236. exit 0