Advertisement
Guest User

Calc project

a guest
Nov 26th, 2014
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.68 KB | None | 0 0
  1. %{
  2. #include <stdio.h>
  3. void yyerror(char *);
  4. int yylex(void);
  5.  
  6. int sym[26];
  7. %}
  8.  
  9. %token INTEGER VARIABLE
  10. %token EXIT
  11. %left '+' '-'
  12. %left '*' '/'
  13. %left '^'
  14. %left '>' '<' GE LE EQ NE
  15. %left COS SIN TAN SQRT EXP CTAN POW LOG
  16.  
  17.  
  18. %%
  19.  
  20. program:
  21. program statement '\n'
  22. | /* NULL */
  23. ;
  24.  
  25. statement:
  26. expression { printf("%d\n", $1); }
  27. | VARIABLE '=' expression { sym[$1] = $3; }
  28. ;
  29.  
  30. expression:
  31. INTEGER
  32. | VARIABLE { $$ = sym[$1]; }
  33. | expression '+' expression { $$ = $1 + $3; }
  34. | expression '-' expression { $$ = $1 - $3; }
  35. | expression '*' expression { $$ = $1 * $3; }
  36. | expression '/' expression { $$ = $1 / $3; }
  37. | '(' expression ')' { $$ = $2; }
  38. | COS expression { $$ = printf("%.2f", cos($2)); }
  39. | SIN expression { $$ = printf("%.2f", sin($2)); }
  40. | TAN expression { printf("%.2f",tan($2)); }
  41. | CTAN expression { printf("%.2f", 1/tan($2)); }
  42. | expression POW expression { $$ = pow($1,$3);}
  43. | SQRT expression { $$ = sqrt($2);}
  44. | LOG expression { printf("%f", log($2));}
  45. | expression '<' expression { ($1 < $3) ? printf("True\n"):printf("False\n"); }
  46. | expression '>' expression { ($1 > $3) ? printf("True\n"):printf("False\n");}
  47. | expression GE expression { ($1 >= $3) ? printf("True\n"):printf("False\n"); }
  48. | expression LE expression { ($1 <= $3) ? printf("True\n"):printf("False\n"); }
  49. | expression EQ expression { ($1 <= $3) ? printf("True\n"):printf("False\n"); }
  50. | expression NE expression { ($1 != $3) ? printf("True\n"):printf("False\n"); }
  51. | EXIT {exit(0);}
  52. ;
  53.  
  54. %%
  55.  
  56. void yyerror(char *s) {
  57. fprintf(stderr, "%s\n", s);
  58. }
  59.  
  60. int main(void) {
  61. yyparse();
  62. }
  63. //================================================================================
  64. //LEX
  65. /* calculator #1 */
  66. %{
  67. #include "y.tab.h"
  68. #include <stdlib.h>
  69. #include <math.h>
  70. void yyerror(char *);
  71. %}
  72.  
  73. %%
  74.  
  75. "cos" return COS;
  76. "sin" return SIN;
  77. "tan" return TAN;
  78. "ctan" return CTAN;
  79. "pow" return POW;
  80. "sqrt" return SQRT;
  81. "log" return LOG;
  82. ">=" return GE;
  83. "<=" return LE;
  84. "==" return EQ;
  85. "!=" return NE;
  86.  
  87. "exit" return EXIT;
  88.  
  89. [a-z]* {
  90. yylval = *yytext - 'a';
  91. return VARIABLE;
  92. }
  93.  
  94. [1-9][0-9]* {
  95. yylval = atoi(yytext);
  96. return INTEGER;
  97. }
  98.  
  99. [-+()=/*\n<>] { return *yytext; }
  100.  
  101. [ \t\n] ; /* skip whitespace */
  102.  
  103. . yyerror("Unknown character");
  104.  
  105. %%
  106.  
  107. int yywrap(void) {
  108. return 1;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement