fork download
  1. %{
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #define YYSTYPE char*
  6. int line = 1;
  7. %}
  8.  
  9. %%
  10. [ \t]+ ; /* Ignore spaces and tabs */
  11. \n { line++; } /* Increment line count on newlines */
  12.  
  13. /* Comments */
  14. \/\/.* { printf("Unité Lexicale Commentaire Ligne %d lexéme //\n", line); }
  15. \/\*([^*]|\*+[^\/])*\*+\/ { printf("Unité Lexicale Commentaire Ligne %d lexéme /* ... */\n", line); }
  16.  
  17. /* Keywords - Case Insensitive */
  18. [sS][iI] { printf("Unité Lexicale Mot_Cle Ligne %d lexéme si\n", line); }
  19. [sS][iI][nN][oO] { printf("Unité Lexicale Mot_Cle Ligne %d lexéme sino\n", line); }
  20. [eE][cC][rR] { printf("Unité Lexicale Mot_Cle Ligne %d lexéme ecr\n", line); }
  21. [vV][rR][aA][iI] { printf("Unité Lexicale Mot_Cle Ligne %d lexéme vrai\n", line); }
  22. [fF][aA][uU][xX] { printf("Unité Lexicale Mot_Cle Ligne %d lexéme Faux\n", line); }
  23. [tT][qQ] { printf("Unité Lexicale Mot_Cle Ligne %d lexéme tq\n", line); }
  24. [qQ][tT] { printf("Unité Lexicale Mot_Cle Ligne %d lexéme qt\n", line); }
  25. [rR][pP][tT] { printf("Unité Lexicale Mot_Cle Ligne %d lexéme rpt\n", line); }
  26. [jJ][sS][qQ] { printf("Unité Lexicale Mot_Cle Ligne %d lexéme jsq\n", line); }
  27. [lL][rR][eE] { printf("Unité Lexicale Mot_Cle Ligne %d lexéme lre\n", line); }
  28.  
  29. /* Integers */
  30. [0-9]+ { printf("Unité Lexicale Int Ligne %d lexéme %s\n", line, yytext); }
  31.  
  32. /* Floats (Scientific Notation or Decimal) */
  33. [-+]?[0-9]+\.[0-9]+([eE][-+]?[0-9]+)? { printf("Unité Lexicale Float Ligne %d lexéme %s\n", line, yytext); }
  34.  
  35. /* Identifiers */
  36. [A-Za-z][A-Za-z0-9]* { printf("Unité Lexicale Identificateur Ligne %d lexéme %s\n", line, yytext); }
  37.  
  38. /* Operators */
  39. "=="|"<="|">="|"!=" { printf("Unité Lexicale Operateur Ligne %d lexéme %s\n", line, yytext); }
  40. [+\-*/=<>!&|] { printf("Unité Lexicale Operateur Ligne %d lexéme %s\n", line, yytext); }
  41.  
  42. /* Separators */
  43. [;,:(){}] { printf("Unité Lexicale Separateur Ligne %d lexéme %s\n", line, yytext); }
  44.  
  45. /* Strings */
  46. \"([^\"\n]|\\.)*\" { printf("Unité Lexicale Chaine Ligne %d lexéme %s\n", line, yytext); }
  47. \".*\n { printf("ERROR Ligne %d Fin de fichier dans une constante chaîne\n", line); line++; }
  48.  
  49. /* Invalid Characters */
  50. . { printf("ERROR Ligne %d Caractère invalide %s\n", line, yytext); }
  51.  
  52. %%
  53.  
  54. int main(int argc, char *argv[]) {
  55. if (argc > 1) {
  56. FILE *file = fopen(argv[1], "r");
  57. if (!file) {
  58. printf("Error: Could not open file %s\n", argv[1]);
  59. return 1;
  60. }
  61. yyin = file;
  62. } else {
  63. yyin = stdin;
  64. }
  65. yylex();
  66. return 0;
  67. }
  68.  
  69. int yywrap() {
  70. return 1;
  71. }
  72.  
Success #stdin #stdout #stderr 0.02s 6980KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
ERROR: /home/3jik9k/prog:2:1: Syntax error: Operator expected
ERROR: /home/3jik9k/prog:71:1: Syntax error: Unexpected end of file
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? EOF: exit