| Line | |
|---|
| 1 | /*
|
|---|
| 2 | * string1.lex: Handling strings by using input()
|
|---|
| 3 | */
|
|---|
| 4 |
|
|---|
| 5 | %{
|
|---|
| 6 | #include <ctype.h>
|
|---|
| 7 | #include <malloc.h>
|
|---|
| 8 |
|
|---|
| 9 | #define ALLOC_SIZE 32 /* for (re)allocating the buffer */
|
|---|
| 10 |
|
|---|
| 11 | #define isodigit(x) ((x) >= '0' && (x) <= '7')
|
|---|
| 12 | #define hextoint(x) (isdigit((x)) ? (x) - '0' : ((x) - 'A') + 10)
|
|---|
| 13 |
|
|---|
| 14 | void yyerror(char *message)
|
|---|
| 15 | {
|
|---|
| 16 | printf("\nError: %s\n",message);
|
|---|
| 17 | }
|
|---|
| 18 |
|
|---|
| 19 | %}
|
|---|
| 20 |
|
|---|
| 21 | %%
|
|---|
| 22 |
|
|---|
| 23 | \" {
|
|---|
| 24 | int inch,count,max_size;
|
|---|
| 25 | char *buffer;
|
|---|
| 26 | int temp;
|
|---|
| 27 |
|
|---|
| 28 | buffer = malloc(ALLOC_SIZE);
|
|---|
| 29 | max_size = ALLOC_SIZE;
|
|---|
| 30 | inch = input();
|
|---|
| 31 | count = 0;
|
|---|
| 32 | while(inch != EOF && inch != '"' && inch != '\n'){
|
|---|
| 33 | if(inch == '\\'){
|
|---|
| 34 | inch = input();
|
|---|
| 35 | switch(inch){
|
|---|
| 36 | case '\n': inch = input(); break;
|
|---|
| 37 | case 'b' : inch = '\b'; break;
|
|---|
| 38 | case 't' : inch = '\t'; break;
|
|---|
| 39 | case 'n' : inch = '\n'; break;
|
|---|
| 40 | case 'v' : inch = '\v'; break;
|
|---|
| 41 | case 'f' : inch = '\f'; break;
|
|---|
| 42 | case 'r' : inch = '\r'; break;
|
|---|
| 43 | case 'X' :
|
|---|
| 44 | case 'x' : inch = input();
|
|---|
| 45 | if(isxdigit(inch)){
|
|---|
| 46 | temp = hextoint(toupper(inch));
|
|---|
| 47 | inch = input();
|
|---|
| 48 | if(isxdigit(inch)){
|
|---|
| 49 | temp = (temp << 4) + hextoint(toupper(inch));
|
|---|
| 50 | } else {
|
|---|
| 51 | unput(inch);
|
|---|
| 52 | }
|
|---|
| 53 | inch = temp;
|
|---|
| 54 | } else {
|
|---|
| 55 | unput(inch);
|
|---|
| 56 | inch = 'x';
|
|---|
| 57 | }
|
|---|
| 58 | break;
|
|---|
| 59 | default:
|
|---|
| 60 | if(isodigit(inch)){
|
|---|
| 61 | temp = inch - '0';
|
|---|
| 62 | inch = input();
|
|---|
| 63 | if(isodigit(inch)){
|
|---|
| 64 | temp = (temp << 3) + (inch - '0');
|
|---|
| 65 | } else {
|
|---|
| 66 | unput(inch);
|
|---|
| 67 | goto done;
|
|---|
| 68 | }
|
|---|
| 69 | inch = input();
|
|---|
| 70 | if(isodigit(inch)){
|
|---|
| 71 | temp = (temp << 3) + (inch - '0');
|
|---|
| 72 | } else {
|
|---|
| 73 | unput(inch);
|
|---|
| 74 | }
|
|---|
| 75 | done:
|
|---|
| 76 | inch = temp;
|
|---|
| 77 | }
|
|---|
| 78 | }
|
|---|
| 79 | }
|
|---|
| 80 | buffer[count++] = inch;
|
|---|
| 81 | if(count >= max_size){
|
|---|
| 82 | buffer = realloc(buffer,max_size + ALLOC_SIZE);
|
|---|
| 83 | max_size += ALLOC_SIZE;
|
|---|
| 84 | }
|
|---|
| 85 | inch = input();
|
|---|
| 86 | }
|
|---|
| 87 | if(inch == EOF || inch == '\n'){
|
|---|
| 88 | yyerror("Unterminated string.");
|
|---|
| 89 | }
|
|---|
| 90 | buffer[count] = '\0';
|
|---|
| 91 | printf("String = \"%s\"\n",buffer);
|
|---|
| 92 | free(buffer);
|
|---|
| 93 | }
|
|---|
| 94 | .
|
|---|
| 95 | \n
|
|---|
| 96 | %%
|
|---|
| 97 |
|
|---|
| 98 |
|
|---|
Note:
See
TracBrowser
for help on using the repository browser.