Guest User

Untitled

a guest
Mar 20th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  1. %{
  2. /*
  3. **
  4. ** samplec.l -- lexical analysia
  5. **
  6. */
  7.  
  8. #ifdef DEBUG
  9.  
  10. # include <assert.h>
  11.  
  12. main ()
  13. {
  14. char * p;
  15.  
  16. assert(sizeof(int) >= sizeof(char *));
  17.  
  18. while (p = (char *) yylex())
  19. printf("%-10.10s is "%s"n",p, yytext);
  20. }
  21.  
  22. s_lookup() {}
  23.  
  24. int yyerrs = 0;
  25.  
  26. # define token(x) (int) "x"
  27.  
  28. #else ! DEBUG
  29.  
  30. # define "y.tab.h"
  31. # define token(x) x
  32.  
  33. #endif DEBUG
  34.  
  35. #define END(v) (v-1 + sizeof v / sizeof v[0])
  36. static int screen();
  37. %}
  38.  
  39. letter [a-zA-Z]
  40. digit [0-9]
  41. letter_or_digit [a-zA-Z0-9]
  42. white_space [ tn]
  43. blank [ t]
  44. other .
  45.  
  46. %%
  47.  
  48. ^"#"{blank}*{digit}+({blank}+.*)?n yymark();
  49.  
  50. ">=" return token(GE);
  51. "<=" return token(LE);
  52. "==" return token(EQ);
  53. "!=" return token(NE);
  54. "+=" return token(PE);
  55. "-=" return token(ME);
  56. "*=" return token(TE);
  57. "/=" return token(DE);
  58. "%=" return token(RE);
  59. "++" return token(PP);
  60. "--" return token(MM);
  61.  
  62. {letter}{letter_or_digit} return screen();
  63.  
  64. {digit}+ { s_lookup(token(Constant));
  65. return token(Constant);
  66. }
  67.  
  68. {white_space}* ;
  69.  
  70. {other} return token(yytext[0]);
  71.  
  72. %%
  73.  
  74. /*
  75. **
  76. ** reserve word screening
  77. **
  78. */
  79.  
  80. static struct rwtable {
  81. char *rw_name;
  82. int rw_yylex;
  83. } rwtable[] ={
  84. "break", token(BREAK),
  85. "continue", token(CONTINUE),
  86. "else", token(ELSE),
  87. "if", token(IF),
  88. "int", token(INT),
  89. "return", token(RETURN),
  90. "while", token(WHILE)
  91. };
  92.  
  93. static int screen()
  94. {
  95. struct rwtable * low = rwtable,
  96. * high = END(rwtable),
  97. * mid;
  98.  
  99. int c;
  100.  
  101. while (low <= high)
  102. {
  103. mid = low + (high-low)/2;
  104. if ((c = strcmp(mid->rw_name, yytext)) == 0)
  105. return mid->rw_yylex;
  106. else if (c < 0)
  107. low = mid+1;
  108. else
  109. high = mid-1;
  110. }
  111. s_lookup(token(Identifier));
  112. return token(Identifier);
  113. }
  114.  
  115. #define token(x) (int) "x"
  116.  
  117. #define token(x) #x
Add Comment
Please, Sign In to add comment