user-0 提问: 100分求c语言或c++（最好c语言）编制的词法分析程序（要求见内部）

回复:
user: user-1
content: BNF都有了, 一行行照着抄就是了.  没几行的事...

user: user-2
content: 比如 const a=1.3  需输出**  REALCON 1.3 表中 const 是 CONSTTK，REALCON 哪來的？

user: user-3
content: DIY LEX+YACC FLEX+BISON

user: user-0
content: 引用 14 楼 FancyMouse 的回复:这用lex yacc就是杀鸡用牛刀。 词法分析你们教的正则语法/DFA呢。把DFA画出来，再写代码简直照图画瓢。

user: user-4
content: 自己看看，慢慢实现

user: user-5
content: 这用lex yacc就是杀鸡用牛刀。 词法分析你们教的正则语法/DFA呢。把DFA画出来，再写代码简直照图画瓢。

user: user-0
content: 引用 12 楼 taodm 的回复:哦，只写词法部分要容易很多。 恩，本周只要词法分析

user: user-6
content: 哦，只写词法部分要容易很多。

user: user-0
content: 引用 10 楼 taodm 的回复:如果不借助现成的lex/yacc库，自己从0实现这样的解析库，纯C++，利用强大的stl，总代码量应该也不低于3K；C嘛，估计要过万了。  应该不用吧。。我同学用c++300多行写出来了，我在网上找了一个词法分析也是270多行，不过实在没时间改啊。。大神能帮我改一下吗 #include <stdio.h>        #include <stdlib.h>  #include <string.h>  #include <ctype.h>  #define LEN sizeof(struct Node)  #define NULL 0    FILE *fp;                                      /*fp是一个指向FILE类型结构的指针变量，可以使fp指向某一个文                                                      件的结构变量，从而通过该结构体变量中的文件信息访问该文件*/ struct Node  {char data;      struct Node *next;                        /* 定义动态链表数据结构   */    };    void output(struct Node*);                /*扫描输出函数*/  void scaner();                              /*词法分析*/    void getbc();    void getch();  void concat();  int letter(char ch);  int degit(char ch);  int reserve();  void retract();  void back(int a,char *b); void back1(int a, int b); struct Node *head,*p;  char ch;                                                  /*全局变量*/    char *key[]={"begin","do","else","end","if","then","var","while"};    /*关键字表*/   char token[20];                                                   /*字符数组，存放构成单词的符号串*/      int main(void)  {      fp = fopen("test.c", "at+");     head=(struct Node *)malloc(LEN);                              /*分配头节点存储空间*/      if(!head) {printf("error");exit(1);}      head->next=NULL;      head->data=' ';     p=head;      printf("输入 \"$\" 结束.\n");      printf("关键字 t=1; 分界符 t=2; 算术运算符 t=3;\n");     printf("关系运算符 t=4; 常数 t=5; 标识符 t=6;\n");     printf("\n");     printf("输入源程序:\n");       while(1)      {          int i=0;          char temp[256];                                            /*每行长度不超过256个字符*/        gets(temp);                                                          /*输入源程序，以行为单位*/        if(temp[0]=='$') break;                                            /*当输入的第一个字符为#时表示输入源代码结束*/               p->next=(struct Node *)malloc(LEN);          if(!(head->next)) {printf("error");exit(1);}          p=p->next;                                                                 /*将输入的代码以行为单位存入缓冲区*/           while(temp[i]!='\0' && i<256)         {              p->data=temp[i];              p->next=(struct Node *)malloc(LEN);              if(!(p->next)) {printf("error");exit(1);}              p=p->next;              i++;        }          p->data='\n';         p->next=NULL;                                                             /*尾结点*/      }            output(head);                                                             /*扫描缓冲区，输出结果*/      p=head->next;      while(p->next!=NULL)       scaner();                                                                 /*词法分析*/      fclose(fp);    system("pause");      return 0;    }          void   output(struct   Node   *head) {     if(!head)   {printf("error");exit(1);}                                /*扫描缓冲区函数*/       p=head->next;        while(p->next!=NULL)        {            printf("%c",p->data);            p=p->next;        }        printf("\n");    }                                                            /*若ch中是空白字符，则不停调用getch()直到读入的不是空白字符为止*/ void getbc() {        while (ch==' ')     getch();    }   void getch()                                              /*从缓冲区读入一字符*/    {     ch=p->data;     p=p->next; }   void concat()                                            /*将ch中的字符连接到token的后面*/    {        unsigned int i;   i=strlen(token);    token[i]=ch;    token[i+1]='\0'; }      int letter(char ch)                                 /*判断ch中的是否是字母*/    {       return isalpha((int)ch); }      int digit(char ch)                                    /*判断ch中的是否是数字*/  {      return isdigit((int)ch); }    int reserve()                                           /*判断token中的字符串是否是关键字或是标识符*/    {      int k;    for(k=0;k<8;k++)    {        if(strcmp(key[k],token)==0) return (k);   }   return 6;                                                 /*如果是标识符返回值为t=6*/ }   void retract()                                      /*指针回退一个字符*/    {    struct Node *Q;    Q=head->next;   while(Q->next!=p)   Q=Q->next;   p=Q; }    void back(int a, char  *b)                              /*返回函数，输出序列*/ {     printf("(%d,%s)\n",a,b);     fprintf(fp,"(%d,%s)\n",a,b); }   void back1(int a, int b)                                /*返回函数，输出序列*/ {      printf("(%d,%d)\n",a,b);   fprintf(fp,"(%d,%d)\n",a,b); }     void scaner()                                            /*词法分析函数*/    {      int c;      token[0]=NULL;                                         /*将token清空*/     getch();        getbc();                                               /*读入一个单词*/        if(letter(ch))                                           /*处理字符的情况*/        {         while(letter(ch)||digit(ch))          {              concat();              getch();          }          retract();      c=reserve();                                      //c中存放的为K的值，当K为6时，是标识符     if(c!=6) back1(1,c);                            //t=1为关键字     else back(6,token);         }     else if(digit(ch))                                    /*处理数字的情况*/        {          while(digit(ch))          {               concat();        getch();          }          retract();         printf("(5,%d)\n",atoi(token));                  fprintf(fp,"(5,%d)\n",atoi(token));     }    else   switch(ch)                                            /*处理特殊符号的情况*/        {         case'+': back(3,"10H");break;                   //符号处理         case'-': back(3,"11H");break;          case'*': back(3,"20H");break;         case'/': back(3,"21H");break;                     //下面的还没处理         case',': back(2,"0");break;         case';': back(2,"1");break;         case'.': back(2,"2");break;         case':=': back(2,"3");break;         case'(': back(2,"4");break;         case')': back(2,"5");break;            case'=': back(4,"02H");break;         case'<': { getch();             if(ch=='=') back(4,"01H");               else if (ch=='>') back(4,"05H");             else              {    retract();                  back(4,"00H");             }           }break;           case'>': {  getch();              if(ch=='=') back(4,"04H");             else { retract();              back(4,"03H");             }         }break;     } }

user: user-6
content: 如果不借助现成的lex/yacc库，自己从0实现这样的解析库，纯C++，利用强大的stl，总代码量应该也不低于3K；C嘛，估计要过万了。

user: user-0

user: user-0
content: 引用 6 楼 baijiaheizhiganmao 的回复:楼主不要连手都不动。至少自己把框架打好。 我看见网上有几个类似的，但是这星期我们老师光是课设就布置了3个，实在没时间做呀，求好人

user: user-7
content: 还是花100分钟研究yacc和lex

user: user-8
content: 楼主不要连手都不动。至少自己把框架打好。

user: user-9
content: 这像是“编译原理”的题啊～～～  哈哈   自己慢慢做吧～～

user: user-10
content: 100块钱都难有人干。。 还是和同学老师讨论吧。小部分不会再来问

user: user-0
content: 引用 2 楼 tpnndhqc 的回复:[quote=引用 1 楼 u013049001 的回复:] 大神快来 楼主啊，说真的，你才是大神啊！谁会弄这样的一整个工程啊！ 小程序论坛能帮你，这玩意也帮？会玩死人的，自己做吧~[/quote] 我是大神就不会来求救了，不知如何下手啊

user: user-11
content: 引用 1 楼 u013049001 的回复:大神快来 楼主啊，说真的，你才是大神啊！谁会弄这样的一整个工程啊！ 小程序论坛能帮你，这玩意也帮？会玩死人的，自己做吧~

user: user-0
content: 大神快来