【发布时间】:2012-05-04 11:07:39
【问题描述】:
我使用 Visual Studio 2010 for C++ 我为 C 编程的词法分析器实现了一个代码,但我收到错误消息“缺少类型说明符 - 假定为 int。注意: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;
}
所以对于这个例子 ( sum + 47 ) / total 这应该是输出
下一个标记是:25 下一个词位是 ( 下一个标记是:11 下一个词位是 sum 下一个标记是:21 下一个词位是 + 下一个标记是:10 下一个词位是 47 下一个标记是:26 下一个词位是 ) 下一个标记是:24 下一个词位是 / 下一个标记是:11 Next lexeme is total 下一个标记是:-1 下一个词位是 EOF
【问题讨论】:
-
您的编译器错误肯定比您在此处发布的信息更能说明问题——例如函数名称或行号,这将引导您准确了解它所抱怨的内容。
-
c++ 编译器不支持 implicint int。需要行号和更好的代码示例。
-
您应该感谢这本书的代码直接复制自:Robert Sebesta 的编程语言概念。来自第 4.2 节的 front.c 文件
标签: c visual-studio-2010 lexical-analysis