我正在使用visual studio 2010 for C ++我实现了一个用于C编程的词法分析器的代码,但是我得到了一个错误,说“缺少类型说明符 - 假设int。注意:C ++不支持default-int”是否有问题我的代码?或者我只需要更改编译器? 这是代码
#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下一个lexeme是( 下一个标记是:11下一个lexeme是sum 下一个标记是:21下一个lexeme是+ 下一个标记是:10下一个lexeme是47 下一个标记是:26下一个lexeme是) 下一个标记是:24下一个lexeme是/ 下一个标记是:11下一个lexeme总计 下一个标记是:-1下一个lexeme是EOF
答案 0 :(得分:2)
main(){
if ((in_fp = fopen("front.in", "r")) == NULL)
printf("ERROR - cannot open front.in \n");
else{
getChar();
do {
lex();
}while (nextToken != EOF);
}
}
应该像这样改变:
// return type of main should be explicitly int.
int main(){
if ((in_fp = fopen("front.in", "r")) == NULL)
printf("ERROR - cannot open front.in \n");
else{
getChar();
do {
lex();
}while (nextToken != EOF);
}
}
答案 1 :(得分:1)
Main声明错误。
它需要命令行参数:
int main(int argc, char *argv[])
{
return 0;
}
或它没有:
int main(void)
{
return 0;
}