bootlex.l 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. %{
  2. /*
  3. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  4. * See the copyright notice in the ACK home directory, in the file "Copyright".
  5. *
  6. * Author: Hans van Staveren
  7. */
  8. #define MAXBACKUP 50
  9. #include <stdio.h>
  10. #include <stdarg.h>
  11. #include <assert.h>
  12. #include <em_spec.h>
  13. #include <em_flag.h>
  14. #include <em_reg.h>
  15. #include "booth.h"
  16. #include "y.tab.h"
  17. /* fileno is not C89 and can be missing sometimes. */
  18. #ifdef __LINUX__
  19. int fileno(FILE *stream);
  20. #endif
  21. int lineno = 1;
  22. extern char *iname;
  23. %}
  24. %p 2000
  25. %%
  26. "/*" { char c;
  27. c = input();
  28. do {
  29. while (c!='*')
  30. c = input();
  31. c = input();
  32. } while (c!='/');
  33. }
  34. "REGISTERS:" return(REGISTERHEAD);
  35. "TOKENS:" return(TOKENHEAD);
  36. "TOKENEXPRESSIONS:" return(EXPRESSIONHEAD);
  37. "CODE:" return(CODEHEAD);
  38. "MOVES:" return(MOVEHEAD);
  39. "TESTS:" return(TESTHEAD);
  40. "STACKS:" return(STACKHEAD);
  41. "SIZEFACTOR" return(SIZEFAC);
  42. "TIMEFACTOR" return(TIMEFAC);
  43. "FORMAT" return(FORMAT);
  44. "cost" return(COST);
  45. "remove" return(REMOVE);
  46. "|" return(SEP);
  47. "samesign" return(SAMESIGN);
  48. "inreg" return(INREG);
  49. "sfit" return(SFIT);
  50. "ufit" return(UFIT);
  51. "defined" return(DEFINED);
  52. "rom" return(ROM);
  53. "loww" return(LOWW);
  54. "highw" return(HIGHW);
  55. "move" return(MOVE);
  56. "erase" return(ERASE);
  57. "allocate" return(ALLOCATE);
  58. "tostring" return(TOSTRING);
  59. "nocc" return(NOCC);
  60. "setcc" return(SETCC);
  61. "samecc" return(SAMECC);
  62. "test" return(TEST);
  63. "STACK" return(STACK);
  64. "nocoercions" return(NOCOERC);
  65. "&&" return(AND2);
  66. "||" return(OR2);
  67. "==" return(CMPEQ);
  68. "!=" return(CMPNE);
  69. "<=" return(CMPLE);
  70. "<" return(CMPLT);
  71. ">" return(CMPGT);
  72. ">=" return(CMPGE);
  73. ">>" return(RSHIFT);
  74. "<<" return(LSHIFT);
  75. "!" return(NOT);
  76. "~" return(COMP);
  77. "..." return(ELLIPS);
  78. EM_WSIZE { yylval.yy_intp = &wsize; return(CIDENT); }
  79. EM_PSIZE { yylval.yy_intp = &psize; return(CIDENT); }
  80. EM_BSIZE { yylval.yy_intp = &bsize; return(CIDENT); }
  81. REGISTER { yylval.yy_string = "REGISTER"; return(TYPENAME); }
  82. INT { yylval.yy_string = "INT"; return(TYPENAME); }
  83. STRING { yylval.yy_string = "STRING"; return(TYPENAME); }
  84. regvar return(REGVAR);
  85. loop return(LOOP);
  86. pointer return(POINTER);
  87. float return(FLOAT);
  88. return return(RETURN);
  89. [_A-Za-z][_A-Za-z0-9]+ {register ident_p ip;
  90. if(!lookident || (ip=ilookup(yytext,JUSTLOOKING))==0) {
  91. yylval.yy_string = scopy(yytext);return(IDENT);
  92. } else {
  93. yylval.yy_ident = ip;
  94. switch(ip->i_type) {
  95. default:assert(0);
  96. case IREG:return(RIDENT);
  97. case IPRP:return(PIDENT);
  98. case ITOK:return(TIDENT);
  99. case IEXP:return(EIDENT);
  100. }
  101. }
  102. }
  103. [a-z] {yylval.yy_char = yytext[0]; return(LCASELETTER);}
  104. [0-9]* {yylval.yy_int = atoi(yytext);return(NUMBER);}
  105. (\"|"%)") { char *p; int c,tipe; char stringbuf[BUFSIZ];
  106. p=stringbuf;
  107. for (;;) {
  108. c = input();
  109. switch(c) {
  110. default: *p++=c;break;
  111. case '\\':
  112. *p++=c; *p++=input(); break;
  113. case '\n':
  114. yyerror("Unterminated string");
  115. unput(c);
  116. /* fall through */
  117. case '"':
  118. tipe=STRING; goto endstr;
  119. case '%':
  120. c=input();
  121. if (c == '(') {
  122. tipe=LSTRING;goto endstr;
  123. } else {
  124. *p++ = '%'; unput(c); break;
  125. }
  126. }
  127. }
  128. endstr:
  129. *p++ = 0;
  130. yylval.yy_string = scopy(stringbuf);
  131. return(tipe);
  132. }
  133. ^\#(line)?[ \t]*[0-9]+[ \t]+\".*\".*$ {
  134. int ind,ind2;
  135. for (ind=0; yytext[ind] < '0' || yytext[ind]>'9'; ind++)
  136. ;
  137. lineno=atoi(&yytext[ind])-1;
  138. for(;yytext[ind]!='"';ind++)
  139. ;
  140. for(ind2=ind+1;yytext[ind2]!='"';ind2++)
  141. ;
  142. yytext[ind2]=0;
  143. if (!iname || strcmp(yytext+ind+1,iname)!=0)
  144. iname=scopy(yytext+ind+1);
  145. }
  146. [ \t]* ;
  147. \n { lineno++; }
  148. . return(yytext[0]);
  149. %%
  150. void yyerror(string s, ...)
  151. {
  152. va_list va;
  153. va_start(va, s);
  154. fprintf(stderr,"\"%s\", line %d:",iname ? iname : "",lineno);
  155. vfprintf(stderr, s, va);
  156. va_end(va);
  157. fprintf(stderr,"\n");
  158. nerrors++;
  159. }