im using visual studio 2010 для C++ i реализовал код для лексического анализатора для программирования на C, но я получил сообщение об ошибке: «Отсутствует спецификатор типа - предполагается int. Примечание: C++ не поддерживает default-int» что-то не так с моим кодом? или мне просто нужно сменить компилятор? здесь кодКод Lexical Analyzer в 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
Вы должны дать кредит, чтобы забронировать этот код был скопирован непосредственно из: Концепции языков программирования Роберт Себесто. front.c из раздела 4.2 –