📄 javascanner.c
字号:
printf("%d: too big for character\n",line);
}
else{
ch=num_value;
}
num_value=0;
}
}
if((ch=token_getch())!='\'')
printf("%d: ''' expected\n");
front=rear;
insert(++position,2,0x106,&ch);
}
/*------------------------------处理分界符及部分运算符-----------------------------*/
else if(ch==','){
front=rear;
insert(++position,2,0x120,",");
}
else if(ch=='{'){
front=rear;
insert(++position,2,0x121,"{");
}
else if(ch=='}'){
front=rear;
insert(++position,2,0x121,"}");
}
else if(ch==';'){
front=rear;
insert(++position,2,0x122,";");
}
else if(ch=='['){
front=rear;
insert(++position,2,0x11d,"[");
}
else if(ch==']'){
front=rear;
insert(++position,2,0x11d,"]");
}
else if(ch=='('){
front=rear;
insert(++position,2,0x11d,"(");
}
else if(ch==')'){
front=rear;
insert(++position,2,0x11d,")");
}
else if(ch=='.'){
ch=token_getch();
if(!isdigit(ch)){
rear--;
front=rear;
insert(++position,2,0x11d,".");
}
else{
do{
id[dex++]=ch;
ch=token_getch();
}while(isdigit(ch));
insert(++position,dex,0x108,id);
rear--;
front=rear;
dex=0;
memset(id,0,100);
}
}
else if(ch=='='){
ch=token_getch();
if(ch=='='){
insert(++position,3,0x117,"==");
}
else{
rear--;
insert(++position,2,0x110,"=");
}
front=rear;
}
else if(ch=='+'){
ch=token_getch();
if(ch=='+'){
insert(++position,3,0x11c,"++");
}
else if(ch=='='){
insert(++position,3,0x110,"+=");
}
else{
rear--;
while(buffer[front--]==' ');
front++;
if( isalpha(buffer[front])||isdigit(buffer[front]) ){
insert(++position,2,0x11a,"+");
}
else{
insert(++position,2,0x11c,"+");
}
}
front=rear;
}
else if(ch=='-'){
ch=token_getch();
if(ch=='-'){
insert(++position,3,0x11c,"--");
}
else if(ch=='='){
insert(++position,3,0x110,"-=");
}
else{
rear--;
while(buffer[front--]==' ');
front++;
if( isalpha(buffer[front])||isdigit(buffer[front]) ){
insert(++position,2,0x11a,"-");
}
else{
insert(++position,2,0x11c,"-");
}
}
front=rear;
}
else if(ch=='*'){
ch=token_getch();
if(ch=='='){
insert(++position,3,0x110,"*=");
}
else{
rear--;
insert(++position,2,0x11b,"*");
}
front=rear;
}
else if(ch=='%'){
ch=token_getch();
if(ch=='='){
insert(++position,3,0x110,"%=");
}
else{
rear--;
insert(++position,2,0x11b,"%");
}
front=rear;
}
else if(ch=='&'){
ch=token_getch();
if(ch=='&'){
insert(++position,3,0x113,"&&");
}
else if(ch=='='){
insert(++position,3,0x110,"&=");
}
else{
rear--;
insert(++position,1,0x116,"&");
}
front=rear;
}
else if(ch=='^'){
ch=token_getch();
if(ch=='='){
insert(++position,3,0x110,"^=");
}
else{
rear--;
insert(++position,2,0x115,"^");
}
front=rear;
}
else if(ch=='|'){
ch=token_getch();
if(ch=='|'){
insert(++position,3,0x112,"||");
}
else if(ch=='='){
insert(++position,3,0x110,"|=");
}
else{
rear--;
insert(++position,2,0x114,"|");
}
front=rear;
}
else if(ch=='!'){
ch=token_getch();
if(ch=='='){
insert(++position,3,0x117,"!=");
}
else{
rear--;
insert(++position,2,0x11c,"!");
}
front=rear;
}
else if(ch=='>'){
ch=token_getch();
if(ch=='>'){
ch=token_getch();
if(ch=='>'){
ch=token_getch();
if(ch=='='){
insert(++position,5,0x110,">>>=");
}
else{
rear--;
insert(++position,4,0x119,">>>");
}
}
else{
rear--;
insert(++position,3,0x119,">>");
}
}
else if(ch=='='){
insert(++position,3,0x118,">=");
}
else{
rear--;
insert(++position,2,0x118,">");
}
front=rear;
}
else if(ch=='<'){
ch=token_getch();
if(ch=='<'){
ch=token_getch();
if(ch=='='){
insert(++position,4,0x110,"<<=");
}
else{
rear--;
insert(++position,3,0x118,"<<");
}
}
else if(ch=='='){
insert(++position,3,0x118,"<=");
}
else{
rear--;
insert(++position,2,0x118,"<");
}
front=rear;
}
else if(ch=='~'){
insert(++position,2,0x11c,"~");
}
else if(ch=='?'){
tri_op=1;
}
else if(ch==':'){
if(tri_op==1){
insert(++position,3,0x111,"?:");
tri_op=0;
}
else{
insert(++position,2,0x11e,":");
}
}
/*------------------------------------数值处理(把数字以字符串的形式记录到单词表中)------------------------------*/
else if(isdigit(ch)){
id[dex++]=ch;
ch=token_getch();
if(ch=='X' || ch=='x'){
do{
id[dex++]=ch;
ch=token_getch();
}while(isdigit(ch)||ch=='A'||ch=='a'||ch=='B'||ch=='b'||ch=='C'||ch=='c'||ch=='D'||ch=='d'||ch=='E'||ch=='e'||ch=='F'||ch=='f');
if(!(ch=='A'||ch=='a'||ch=='B'||ch=='b'||ch=='C'||ch=='c'||ch=='D'||ch=='d'||ch=='E'||ch=='e'||ch=='F'||ch=='f')&&(isalpha(ch))){
id[dex++]=ch;
insert(++position,dex,0x100,id);
}
else
insert(++position,dex,0x107,id);
dex=0;
memset(id,0,100);
}
else{
while(isdigit(ch)){
id[dex++]=ch;
ch=token_getch();
}
if(ch=='L'||ch=='l'){
id[dex++]=ch;
ch=token_getch();
insert(++position,dex,0x107,id);
rear--;
front=rear;
dex=0;
memset(id,0,100);
}
else if(ch=='.'||ch=='e'||ch=='E'){
do{
id[dex++]=ch;
ch=token_getch();
}while(isdigit(ch));
if(ch=='F'|| ch=='f'){
id[dex++]=ch;
rear--;
front=rear;
ch=token_getch();
}
insert(++position,dex,0x108,id);
dex=0;
rear--;
front=rear;
memset(id,0,100);
}
else if(!( isalpha(ch)&&!(ch=='L'||ch=='l'||ch=='e'||ch=='E'||ch=='F'|| ch=='f') )){
insert(++position,dex,0x108,id);
dex=0;
rear--;
front=rear;
memset(id,0,100);
}
else{
id[dex++]=ch;
insert(++position,dex,0x100,id);
dex=0;
rear--;
front=rear;
memset(id,0,100);
}
}
}
/*-----------------------------其他情况视为错误单词--------------------------------------------*/
else if(ch!=EOF){
insert(++position,2,0x100,id);
dex=0;
rear--;
front=rear;
memset(id,0,100);
}
}
}
int main(int argc,char * argv[]){
char filename[100],dest_file[100];
int total=0;
int i,line_num;
struct token* p;
token_list_head=(struct token*)malloc(sizeof(token));
token_list_head->next_token=NULL;
token_list_tail=token_list_head;
//设立缓冲区标志位
buffer[1023]=EOF;
buffer[2047]=EOF;
//输入原文件名及目标文件名
printf("Please enter source file name:\n");
scanf("%s",filename);
printf("\n");
printf("Please enter destination file name:\n");
scanf("%s",dest_file);
//打开文件,并将1023个字符读入前一半缓冲区
fin=fopen(filename,"rb+");
if(fin==NULL){
printf("FILE_CANNOT_OPEN\n");
}
else{
load(fin,0);
}
//开始分析
get_token();
//将分析结果写入目标文件
if((fin=fopen(dest_file,"w"))==NULL){
}
else{
fprintf(fin,"\n%s:\n\n"," 词法分析结果如下(每个单词包含四个属性值:行号,在该行中位置,十六进制属性值,字面值)");
for(p=token_list_head->next_token;p!=NULL;p=p->next_token){
total++;
fprintf(fin,"%s"," ");
fputc('(',fin);
fprintf(fin,"第 %3d行 ,第 %3d个单词, 0x%x , \"%s\" ",p->lineno,p->position,p->wordkey,p->value);
fputc(')',fin);
fputc('\n',fin);
}
fprintf(fin,"\n%s: %d\n\n"," 单词总量为",total);
p=token_list_head->next_token;
for(i=1;i<=line;i++){
line_num=0;
while(p!=NULL&&p->lineno==i){
p=p->next_token;
line_num++;
}
fprintf(fin," 第 %3d行中单词数量为: %d\n",i,line_num);
}
fclose(fin);
printf("Result writed to result.txt successed!\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -