Note that there are some explanatory texts on larger screens.

plurals
  1. POget error in definition
    primarykey
    data
    text
    <p>Hi first I like to thank you all for your help We have to use complier code wrote in book but I have error in defining one of the functions lexan can you help me solve it I mark it bold</p> <pre><code>/* global.h */ #include &lt;stdio.h&gt; /* include declarations for i/o routines */ #include &lt;ctype.h&gt; /* ... and for character test routines */ #include &lt;stdlib.h&gt; /* ... and for some standard routines, such as exit */ #include &lt;string.h&gt; /* ... and for string routines */ #define BSIZE 128 /* buffer size */ #define NONE -1 #define EOS '\0' #define NUM 256 #define DIV 257 #define MOD 258 #define ID 259 #define DONE 260 extern int tokenval = NONE; /* value of token attribute */ extern int lineno = 1; struct entry { /* form of symbol table entry */ char *lexptr; int token; }; extern struct entry symtable[]; /* symbol table */ extern void init(); /* loads keywords into symtable */ extern void error(char* m); /* generates all error messages */ /*BOLD*/ extern int lexan(); /* lexical analyzer */** extern void parse(); /* parses and translates expression list */ extern int insert(char *s, int tok); /* returns position of entry for s */ extern int lookup(char *s); /* returns position of entry for s */ extern void emit (int t, int tval); /* generates output */ /* init.c */ struct entry keywords[] = { { "div", DIV }, { "mod", MOD, }, { 0, 0 } }; void init() /* loads keywords into symtable */ { struct entry *p; for (p = keywords; p-&gt;token; p++) insert(p-&gt;lexptr, p-&gt;token); } /* symbol.c */ #define STRMAX 999 /* size of lexemes array */ #define SYMMAX 100 /* size of symbol table */ char lexemes[STRMAX]; int lastchar = - 1; /* last used position in lexemes */ struct entry symtable[SYMMAX]; int lastentry = 0; /* last used position in symtable */ int lookup(char *s) /* returns position of entry for s */ { int p; for (p = lastentry; p &gt; 0; p = p - 1) if (strcmp(symtable[p].lexptr, s) == 0) return p; return 0; } int insert(char *s, int tok) /* returns position of entry for s */ { int len; len = strlen(s); /* strlen computes length of s */ if (lastentry + 1 &gt;= SYMMAX) error ("symbol table full"); if (lastchar + len + 1 &gt;= STRMAX) error ("lexemes array full"); lastentry = lastentry + 1; symtable[lastentry].token = tok; symtable[lastentry].lexptr = &amp;lexemes[lastchar + 1]; lastchar = lastchar + len + 1; strcpy(symtable[lastentry].lexptr, s); return lastentry; } /* lexer.c */ char lexbuf[BSIZE]; int lexan () /* lexical analyzer */ { int t; while(1) { t = getchar (); if (t == ' ' || t == '\t') ; /* strip out white space */ else if (t == '\n') lineno = lineno + 1; else if (isdigit (t)) { /* t is a digit */ ungetc(t, stdin); scanf("%d", &amp;tokenval); return NUM; } else if (isalpha(t)) { /* t is a letter */ int p, b = 0; while (isalnum(t)) { /* t is alphanumeric */ lexbuf [b] = t; t = getchar (); b = b + 1; if (b &gt;= BSIZE) error("compiler error"); } lexbuf[b] = EOS; if (t != EOF) ungetc(t, stdin); p = lookup (lexbuf); if (p == 0) p = insert (lexbuf, ID); tokenval = p; return symtable[p].token; } else if (t == EOF) return DONE; else { tokenval = NONE; return t; } } } /* emitter.c */ void emit (int t, int tval) /* generates output */ { switch(t) { case '+' : case '-' : case '*' : case '/': printf("%c\n", t); break; case DIV: printf("DIV\n"); break; case MOD: printf("MOD\n"); break; case NUM: printf("%d\n", tval); break; case ID: printf("%s\n", symtable[tval].lexptr); break; default: printf("token %d, tokenval %d\n", t, tval); } } /* parser.c -- without the optimizations */ int lookahead; void match(int); void start(), list(), expr(), moreterms(), term(), morefactors(), factor(); void parse() /* parses and translates expression list */ { lookahead = lexan(); start(); } void start () { /* Just one production for start, so we don't need to check lookahead */ list(); match(DONE); } void list() { if (lookahead == '(' || lookahead == ID || lookahead == NUM) { expr(); match(';'); list(); } else { /* Empty */ } } void expr () { /* Just one production for expr, so we don't need to check lookahead */ term(); moreterms(); } void moreterms() { if (lookahead == '+') { match('+'); term(); emit('+', tokenval); moreterms(); } else if (lookahead == '-') { match('-'); term(); emit('-', tokenval); moreterms(); } else { /* Empty */ } } void term () { /* Just one production for term, so we don't need to check lookahead */ factor(); morefactors(); } void morefactors () { if (lookahead == '*') { match('*'); factor(); emit('*', tokenval); morefactors(); } else if (lookahead == '/') { match('/'); factor(); emit('/', tokenval); morefactors(); } else if (lookahead == DIV) { match(DIV); factor(); emit(DIV, tokenval); morefactors(); } else if (lookahead == MOD) { match(MOD); factor(); emit(MOD, tokenval); morefactors(); } else { /* Empty */ } } void factor () { if (lookahead == '(') { match('('); expr(); match(')'); } else if (lookahead == ID) { int id_lexeme = tokenval; match(ID); emit(ID, id_lexeme); } else if (lookahead == NUM) { int num_value = tokenval; match(NUM); emit(NUM, num_value); } else error("syntax error in factor"); } void match(int t) { if (lookahead == t) lookahead = lexan(); else error ("syntax error in match"); } /* error.c */ void error(char* m) /* generates all error messages */ { fprintf(stderr, "line %d: %s\n", lineno, m); exit(EXIT_FAILURE); /* unsuccessful termination */ } /* main.c */ int main(void) { init(); parse(); exit(0); /* successful termination */ } /*BOLD*/ int lexan() /* lexical analyzer */ { int t; while(1) { t = getchar (); if (t == ' ' || t == '\t') ; /* strip out white space */ else if (t == '\n') lineno = lineno + 1; else if (isdigit (t)) { /* t is a digit */ ungetc(t, stdin); scanf("%d", &amp;tokenval); return NUM; } else if (isalpha(t)) { /* t is a letter */ int p, b = 0; while (isalnum(t)) { /* t is alphanumeric */ lexbuf [b] = t; t = getchar (); b = b + 1; if (b &gt;= BSIZE) error("compiler error"); } lexbuf[b] = EOS; if (t != EOF) ungetc(t, stdin); p = lookup (lexbuf); if (p == 0) p = insert (lexbuf, ID); tokenval = p; return symtable[p].token; } else if (t == EOF) return DONE; else { tokenval = NONE; return t; } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload