scan.l 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. %{
  2. #ifndef NORCSID
  3. static char rcsid2[]= "$Header$";
  4. #endif
  5. char *mystrcpy();
  6. int myatoi();
  7. int lineno=1;
  8. extern char *filename;
  9. %}
  10. %%
  11. "/*" { char c;
  12. c = input(); if (c=='\n') lineno++;
  13. do {
  14. while (c!='*') {
  15. c = input();
  16. if (c=='\n') lineno++;
  17. }
  18. c = input();
  19. if (c=='\n') lineno++;
  20. } while (c!='/');
  21. }
  22. ^\#[ \t]+[0-9]+[ \t]+\".*\"$ {
  23. int ind,ind2;
  24. lineno=atoi(yytext+1)-1;
  25. for(ind=0;yytext[ind]!='"';ind++)
  26. ;
  27. for(ind2=ind+1;yytext[ind2]!='"';ind2++)
  28. ;
  29. yytext[ind2]=0;
  30. if (strcmp(yytext+ind+1,filename)!=0)
  31. filename=mystrcpy(yytext+ind+1);
  32. }
  33. [a-z]{3} { if (!emhere || (yylval.yy_int=mlookup(yytext))==0)
  34. REJECT;
  35. return(EMMNEM);
  36. }
  37. "==" return(CMPEQ);
  38. "!=" return(CMPNE);
  39. "<" return(CMPLT);
  40. "<=" return(CMPLE);
  41. ">" return(CMPGT);
  42. ">=" return(CMPGE);
  43. "||" return(OR2);
  44. "&&" return(AND2);
  45. "<<" return(LSHIFT);
  46. ">>" return(RSHIFT);
  47. "!" return(NOT);
  48. "~" return(COMP);
  49. ":ro" { yylval.yy_int = AD_RO; return(ADORNACCESS); }
  50. ":wo" { yylval.yy_int = AD_WO; return(ADORNACCESS); }
  51. ":rw" { yylval.yy_int = AD_RW; return(ADORNACCESS); }
  52. ":cc" { yylval.yy_int = AD_CC; return(ADORNCC); }
  53. \$[0-9]+ { yylval.yy_int = atoi(yytext+1); return(DOLLAR); }
  54. \%[0-9]+ { yylval.yy_int = atoi(yytext+1); return(PERCENT); }
  55. \%[a-z] { yylval.yy_int = yytext[1]-'a'; return(ALLREG); }
  56. [0-9]+|0x[0-9A-Fa-f]+ { yylval.yy_int = myatoi(yytext); return(NUMBER); }
  57. [_A-Za-z][_A-Za-z0-9]* { register symbol *sy_p;
  58. if ((sy_p=lookup(yytext,symkeyw,justlooking))!=0)
  59. return(sy_p->sy_value.syv_keywno);
  60. yylval.yy_str = mystrcpy(yytext); return(IDENT);
  61. }
  62. \%[_A-Za-z][_A-Za-z0-9]* { yylval.yy_str = mystrcpy(yytext+1);
  63. return(PERC_IDENT);
  64. }
  65. \"[^"\n]*\" { yytext[yyleng-1]=0;
  66. yylval.yy_str = mystrcpy(yytext+1);
  67. return(STRING);
  68. }
  69. [0-9][bf] { yytext[2]=0;
  70. yylval.yy_str = mystrcpy(yytext);
  71. return(STRING);
  72. }
  73. \n { lineno++; }
  74. [ \t]* ;
  75. . return(yytext[0]);
  76. %%
  77. int skipping=0;
  78. yywrap() {
  79. if (skipping)
  80. fatal("EOF reached during error recovery");
  81. return(1);
  82. }
  83. skipupto(tok,str) char *str; {
  84. register i;
  85. skipping=1;
  86. while (yylex()!=tok)
  87. ;
  88. for(i=strlen(str); i>0; i--)
  89. unput(str[i-1]);
  90. skipping=0;
  91. }