即時通訊使用visual studio 2010 for C++我爲C編程實現了一個詞法分析器的代碼,但是我得到一個錯誤,提示「缺少類型說明符 - int假定。注意:C++不支持default-int」我的代碼有什麼問題嗎?或者我只需要改變編譯器? 這裏是這被假設是所述輸出Lexical Analyzer code in C
下一個標記是代碼
#include <stdio.h>
#include <ctype.h>
//Global variables
int charClass;
char lexeme [100];
char nextChar;
int lexLen;
int token;
int nextToken;
FILE *in_fp, *fopen();
// Function Declarations
void addChar();
void getChar();
void getNonBlank();
int lex();
//Character classes
#define LETTER 0
#define DIGIT 1
#define UNKNOWN 99
//Token codes
#define INT_LIT 10
#define IDENT 11
#define ASSIGN_OP 20
#define ADD_OP 21
#define SUB_OP 22
#define MULT_OP 23
#define DIV_OP 24
#define LEFT_PAREN 25
#define RIGHT_PAREN 26
//Main
main(){
if ((in_fp = fopen("front.in", "r")) == NULL)
printf("ERROR - cannot open front.in \n");
else{
getChar();
do {
lex();
}while (nextToken != EOF);
}
}
// lookUp
int lookup(char ch){
switch(ch){
case '(':
addChar();
nextToken = LEFT_PAREN;
break;
case ')':
addChar();
nextToken = RIGHT_PAREN;
break;
case '+':
addChar();
nextToken = ADD_OP;
break;
case'-':
addChar();
nextToken = SUB_OP;
break;
case'*':
addChar();
nextToken = MULT_OP;
break;
case'/':
addChar();
nextToken = DIV_OP;
break;
default:
addChar();
nextToken = EOF;
break;
}
return nextToken;
}
//AddChar
void addChar(){
if (lexLen <= 98) {
lexeme[lexLen++] = nextChar;
lexeme[lexLen] = 0;
}
else
printf("Error - lexeme is too long \n");
}
//getChar
void getChar(){
if ((nextChar = getc(in_fp)) != EOF) {
if (isalpha(nextChar))
charClass = LETTER;
else if (isdigit(nextChar))
charClass = DIGIT;
else charClass = UNKNOWN;
}
else
charClass = EOF;
}
// getNonBlank
void getNonBlank(){
while (isspace(nextChar))
getChar();
}
//lex
int lex(){
lexLen = 0;
getNonBlank();
switch (charClass){
case LETTER:
addChar();
getChar();
while (charClass == LETTER || charClass == DIGIT){
addChar();
getChar();
}
nextToken = IDENT;
break;
// parse ints lits
case DIGIT:
addChar();
getChar();
while (charClass == DIGIT){
addChar();
getChar();
}
nextToken = INT_LIT;
break;
//pares and ops
case UNKNOWN:
lookup(nextChar);
getChar();
break;
//EOF
case EOF:
nextToken = EOF;
lexeme[0] = 'E';
lexeme[1] = 'O';
lexeme[2] = 'F';
lexeme[3] = 0;
break;
}
// end of switch
printf("Next toke is: %d, next lexeme is %s\n",nextToken, lexeme);
return nextToken;
}
所以對於該示例(總和+ 47)/總 :25下一個詞位是( 下一個標記是:11接下來詞位是總和 下一個標記是:21接着詞位是+ 下一個標記是:10下詞位是47 下一個標記是:26接着詞位是) 下一個標記是:24下詞位是/ 下一個標記是:11下一個詞位總計爲 下一個詞條爲:-1下一個詞位是EOF
當然你的編譯錯誤,告訴你,超過你已經張貼在這裏 - 就像函數名或行號一樣,它會引導你完全抱怨它。 – mah
C++編譯器不支持implicint int。需要行號和更好的代碼示例是切割。 – iyasar
您應該認爲書中的代碼是直接從Robert Sebesta編程語言的概念中複製的。 4.2節的front.c文件 –