实验一、词法分析

本文介绍了一个词法分析程序的设计与实现,该程序能够将源程序字符串解析为一系列的二元组,每个二元组包含词法单元的种别和单词本身。程序详细展示了词法分析的原理、流程图、主要算法和关键函数实现,以及如何处理不同类型的词法单元,如关键字、标识符、数字、运算符等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                                         实验一、词法分析

一、    实验目的

编制一个词法分析程序

二、    实验内容和要求

输入:源程序字符串

输出:二元组(种别,单词本身)

待分析语言的词法规则

 

三、 实验方法、步骤及结果测试

1. 原理分析及流程图

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

1.      主要程序段及其解释:

实现主要功能的程序段,重要的是程序的注释解释。

 

#include <stdio.h>

 #include <string.h> 

 char prog[30],token[5],ch;

 int syn,p,m,n,sum;

 char *rwtab[6]={"begin","if","then","while","do","end"};

 scaner();

 main()

  {p=0; 

    printf("请输入需要分析的字符串,以“#”结束):");

  do{ 

       scanf("%c",&ch);

       prog[p++]=ch;

   }while(ch!='#');

     p=0;

  do{  scaner();

     switch(syn) 

     {    case 11:printf("( %-10d%5d )\n",sum,syn);

          break; 

          case -1:printf("you have input a wrong string\n");

         getch();

         exit(0); 

          default: printf("( %-10s%5d )\n",token,syn);

          break;

  } 

  }while(syn!=0);

    getch(); 

  }

     scaner()

     {  sum=0; 

      for(m=0;m<8;m++)token[m++]=NULL;

       ch=prog[p++];

       m=0; 

   while((ch==' ')||(ch=='\n'))ch=prog[p++]; 

   if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))) 

   {

       while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

   {

           token[m++]=ch;

           ch=prog[p++];

  } 

      p--;

      syn=10;

      for(n=0;n<6;n++) 

      if(strcmp(token,rwtab[n])==0)

      {  syn=n+1;

         break; 

      }

   } 

      else if((ch>='0')&&(ch<='9'))

      {  while((ch>='0')&&(ch<='9'))

      {  sum=sum*10+ch-'0';

          ch=prog[p++];

      }

        p--; 

        syn=11;

      } 

       else switch(ch) 

       {   case '<':token[m++]=ch;

      ch=prog[p++];

  if(ch=='=')

  {

     syn=22; 

      token[m++]=ch;

  } 

 else 

  {

     syn=20; 

     p--; 

  }

   break; 

     case '>':token[m++]=ch;

      ch=prog[p++];

      if(ch=='=')

      {   syn=24; 

          token[m++]=ch;

   }

   else 

   {    syn=23;

         p--;

   }

   break; 

         case '+': token[m++]=ch;

         ch=prog[p++];

 if(ch=='+')

  {    syn=17; 

       token[m++]=ch;

  } 

 else 

 {     syn=13;

       p--; 

  }

  break;

          case '-':token[m++]=ch; 

             ch=prog[p++];

      if(ch=='-')

      {        syn=29; 

           token[m++]=ch;

      } 

          else 

         {       syn=14;

                 p--;

         } 

           break;

        case '!':ch=prog[p++];

     if(ch=='=')

     { syn=21; 

     token[m++]=ch;

     }

     else

     { syn=31;

        p--;

     } 

       break;

       case '=':token[m++]=ch;

           ch=prog[p++];

            if(ch=='=')

            { syn=25; 

               token[m++]=ch; 

            }

       else

       { syn=18;

          p--;        }

         break;

         case '*': syn=15; 

           token[m++]=ch; 

           break;

         case '/': syn=16; 

            token[m++]=ch;

            break;

         case '(': syn=27;

             token[m++]=ch;

             break;

         case ')': syn=28; 

             token[m++]=ch;

             break;

         case '{': syn=5; 

             token[m++]=ch;

             break;

         case '}': syn=6;

             token[m++]=ch;

             break;

         case ';': syn=26; 

             token[m++]=ch;

             break;

         case '\"': syn=30; 

             token[m++]=ch;

              break;

         case '#': syn=0; 

             token[m++]=ch;

              break;

         case ':':syn=17; 

             token[m++]=ch; 

              break;

         default: syn=-1;

              break;

 }

 token[m++]='\0';

 } 

 

 

2. 运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

转载于:https://www.cnblogs.com/li123/p/5961346.html

### 关于词法分析语法分析的实验内容 #### 、概述 编译器构建中的两个重要阶段分别是词法分析和语法分析。这两个过程对于将源代码转换为目标机器指令至关重要[^1]。 #### 二、词法分析 词法分析的任务是从输入程序中读取字符流并将其分割成有意义的单元——记号(Token)[^2]。这些记号通常包括关键字、标识符、运算符以及分隔符等。为了实现这目标,常常会定义正则表达式来描述每种类型的合法形式,并利用有限状态自动机(Finite State Automaton, FSA)来进行模式匹配操作。 ```python import re def lexical_analyzer(code_string): tokens_specification = [ ('NUMBER', r'\d+(\.\d*)?'), # Integer or decimal number ('ASSIGN', r':='), # Assignment operator ('END', r';'), # Statement terminator ('ID', r'[A-Za-z]+'), # Identifiers ('OP', r'[+\-*/]'), # Arithmetic operators ('NEWLINE', r'\n'), # Line endings ('SKIP', r'[ \t]+'), # Skip over spaces and tabs ('MISMATCH', r'.'), # Any other character ] tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in tokens_specification) line_num = 1 line_start = 0 for mo in re.finditer(tok_regex, code_string): kind = mo.lastgroup value = mo.group() if kind == 'NEWLINE': line_start = mo.end() line_num += 1 elif kind == 'SKIP': pass elif kind == 'MISMATCH': raise RuntimeError(f'{value!r} unexpected on line {line_num}') else: yield (kind, value) for token_kind, token_value in lexical_analyzer("x := y + z;"): print(token_kind, token_value) ``` 上述Python脚本展示了如何创建简单的词法解析函数`lexical_analyzer()`用于处理字符串表示的小型编程语言片段[^3]。 #### 三、语法分析 旦完成了词法分析工作,则进入到了下个环节即语法分析。此部分旨在验证由前步骤产生的序列是否遵循特定上下文无关文法规则(Context-Free Grammar),从而形成抽象语法树(Abstract Syntax Tree, AST)[^4]。常用的技术有自顶向下(Top-down Parsing)方法如LL(k)或者自底向上(Bottom-up parsing)方式像LR(1)/SLR/LALR等。 ```antlr grammar SimpleExpression; prog: stat+ ; stat: expr NEWLINE # printExpr | ID ASSIGN expr NEWLINE # assign ; expr: expr op=('*'|'/') expr # MulDiv | expr op=('+'|'-') expr # AddSub | INT # int | ID # id | '(' expr ')' # parens ; NEWLINE : [\r\n]+ ; WS : [ \t]+ -> skip; INT : [0-9]+ ; ID : [a-zA-Z_][a-zA-Z_0-9]* ; ASSIGN : ':=' ; ``` 这段ANTLR语法规则是用来识别基本算术表达式的结构化信息,并能够区分变量赋值语句和其他类型的操作[^5]。 #### 四、总结 通过以上介绍可以了解到,在计算机科学领域内的编译原理课程里,学生将会接触到有关词法分析和语法分析的知识点及其实践应用案例研究。这不仅有助于加深理解高级软件开发背后的工作机制,也为后续深入学习编译优化提供了坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值