编译原理的一个简单的枚举算法

2016-02-19 19:58 7 1 收藏

下面这个编译原理的一个简单的枚举算法教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】

 

  模仿C

  能判断#include;main();int;char;for;printf;scanf;{};

  

  

  

   private
    //在str中找第一个单词 如果 找到则返回第一个单词的地址(phrase)和下一个要分析单词的入口(nextptr)
     //如果str是空串则返回false
      function phrase(str:string;phrase,nextptr:pchar):bool; //
      //括号匹配函数
      //p;判断字符的地址,char:什么括号(包括:;()2种),deep:允许嵌套么?匹配成功返回true;
      function brkmatch(p:pchar;brk:char;deep:bool;next:pchar):bool;
      function corbeil(r:trichedit;line,col:pinteger):bool; //line 返回出错的行,col返回出错的列;
      function semicolon(p,next:pchar):bool;//p:入口地址  next:下一个字符的地址
       //semicolon   如果没找到 返回false next=nil 找到其他字符 返回false且 next便指向他的下一个
      function analys(sour,dest:trichedit):bool;

    public
      { Public declarations }
    end;

  var
    Form1: TForm1;

  implementation

  {$R *.dfm}
  function tform1.corbeil(r:trichedit;line,col:pinteger):bool;
  var
  n,l,i,c:integer;
  temp:pchar;
  ptr:pchar;
  begin
  i:=0;
  c:=r.Lines.Count;
  n:=0;
    while c1 do
    begin
    getmem(temp,length(r.Lines.Strings[i])+1);
    strcopy(temp,pchar(r.Lines.Strings[i]));
    ptr:=temp;
    l:=length(r.Lines.Strings[i]);
      while  l1 do
      begin
        if ptr^='{' then
        begin
        n:=n+1;
        end
        else
          if ptr^='}'then
          if n0 then
          n:=n-1
          else
            begin
            result:=false;
            break;
            line^:=r.Lines.Count-c+1;
            col^:=length(r.Lines.Strings[i])-l+1;
            end;
         l:=l-1;
      end;// while  l1 do
    freemem(temp);
    i:=i+1;
    c:=c-1;
    end;//while  line less than  linecount
  if n=0 then
  result:=true
  else
  result:=false;
  end;

  function tform1.phrase(str:string;phrase,nextptr:pchar):bool;
  var
  phr:pchar;
  n:pchar;
  temp:pchar;
  ptr:pchar; //指向下一个要分析的单词的地址

  begin
  n:=' ';
  str:=trim(str);
  if length(str)0 then
  begin
  getmem(temp,length(str)+1);
  strcopy(temp,pchar(str));
  ptr:=strpos(temp,n);
  getmem(phr,integer(ptr-temp)+1);
  strlcopy(phr,temp,integer(ptr-temp));
  phrase:=phr;
  nextptr:=ptr;//是空格
  result:=true;
  end
  else
  result:=false;
  freemem(temp);
  end;
  function tform1.brkmatch(p:pchar;brk:char;deep:bool;next:pchar):bool;
  var
  n,len:integer;
  begin
  len:=strlen(p)-1;
  if deep=true then
    begin
    if p^='('then
        begin
          n:=1;
          while len0 do
            begin
            p:=p+1;
            if p^='(' then
                n:=n+1
              else
                 if p^=')' then
                 if n0  then
                      n:=n-1
                 else
                 begin
                   result:=false;
                   next:=p+1;   //不成功 flase next不为空表示)多余
                   break;
                 end;

            end;  //while over;
          if n0 then
          begin
            result:=false;
            next:=nil;//result=false且next为空表示(多余
          end
          else
            begin
            result:=true;   //如果'('匹配成功则 true next 为 null
            next:=nil;
            end;//else
        end; //if p^='('then over

  
    end //if deep=true then over
  else
  if deep=false then
  begin
    if  p^=''  then
    begin
      while len0 do
      begin
        len:=len-1;
        p:=p+1;
        if p^=''then
        begin
          result:=true;
          break;
          next:=p+1;    //如果是''匹配成功,true且next指向下一个要分析的字符
        end;  //    if p^=''then
      end;//while len0 do
      if len=0 then
      begin
      result:=false;
      next:=nil;
      end;//len=0 over
      end// if
    else   //如果第一个字符不是‘’ 则返回错误 并带回下一个 指针
    begin
      result:=false;
      next:=p+1;

    end; //

  

  end; //if deep=false then ovser

  end;   //function over;
  function tform1.semicolon(p,next:pchar):bool;//p:入口地址
  var
  temp,ptr:pchar;
  i:integer;
  begin
  i:=strlen(p);
  while i1 do
  begin
  if p^=';'then
  begin
  result:=true;
  next:=p+1;
  break;
  end;//if p^=';'then
  if  p^=' 'then
  begin
  i:=i-1;
  p:=p+1;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  
  end;// if  p^=' '
  if ((p^' ')or (p^';'))then
  begin
  result:=false;
  next:=p+1;
  break;
  end;
  end;//while
  if i=1  then
  begin
  result:=false;
  next:=nil;
  end;
  end;//function semicolon(p:pchar)over;
  function analys(sour,dest:trichedit):bool;
  var
  able,unable:bool;
  lcount,lwords,i :integer;
  phr,nextp:pchar;
  phr2,nextp2,temp21,temp22:pchar;
  phr3,nextp3:pchar;
  braket:char;
  s:string;
  begin
  temp21:=nil;
  temp22:=nil;
  able:=true;
  unable:=false;
  lcount:=sour.Lines.Count;
  i:=0;
  while lcount 1 do
    begin
    s:=sour.Lines.Strings[i];  //将行赋给 s
    if trim(pchar(s))nil then    //非空串
      begin

      if phrase(s;phr;nextp)=true then //如果还有字符
      //以下开始处理标志符识别和简单的语法分析
          begin
          if phr^='#' then
              begin     //判断下一个字符是不是include
              if phrase(nextp,phr2,nextp2)=true then
                  begin
                  if phr2='include' then   //找下一个非空字符
                      begin
                      while ((nextp2^=' ')and (strlen(nextp2)0))do
                            begin
                            temp22:= nextp2;
                            nextp2:=nextp2+1;
                            end; //   while nextp2^' 'over
                       if nextp2^' 'then ////调用尖括号识别函数
                          begin
                          braket:='';
                          if brakmatch(nextp2,braket,unabel)=true then
                          begin

                          end;

                          end;
                      end;//  if phr2='include' then over
                  end;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

              end;
          end;
      end;
    end;//while  lcount 1
  end;

来源:http://www.tulaoshi.com/n/20160219/1622440.html

延伸阅读
标签: Web开发
我现在还不会写持久层,就用这种方法加上存储过程用,我感觉还比较爽,希望大家多多指教 public class clsdb {      public clsdb()  {   //   // TODO: 在此处添加构造函数逻辑   //  } //数据库连接     public static SqlCo...
标签: Web开发
其实就是 prototype 1.4中 枚举对象部分 的简化版本,  先贴代码,等下再一一解释,对初学者可能有帮助  最近一直在学习Python,一直感叹于python中 list的灵活,  同样都是数组,为什么javascript不能和python中的一样灵活呢,  (其实下面这些 prototype 1.4已经实现了,不过 ...
蘑菇简笔画视频教程 先放上蘑菇简笔画的视频,跟着视频做,视频后还有步骤可以跟着做,画完之后你一定觉得是特别的容易。画了之后尽量的反复画来培养自己的动手能力吧。     蘑菇简笔画步骤教程 1、首先画出蘑菇的大致形状 2、在蘑菇里画一个弧形 3、画出蘑菇的梗 4、然后画出蘑菇的花纹,也可以画出其他的花纹...
蛇简笔画的视频教程    蛇简笔画的视频教程 1、画一个圆作为蛇的一个眼睛。 2、再用同样的方法画出另外一个眼睛,眼睛一大一小会显得可爱。并画出黑色的眼球。 3、在眼球里画出眼白。 4、接下来画出蛇的脸。 5、在画出蛇的舌头 6、再就是画蛇的身体了。要画出蛇的哪种弧度。 7、补全蛇的尾巴。 8...
标签: Web开发
我们可以看到,DTD的语法相当复杂,并且它不符合XML文件的标准,自成一个体系。也就是说DTD文档本身并不是一个良好形式的XML文档,上面的关于DTD的介绍也仅仅是作了一个简介,目的是帮助大家能读懂DTD文件以及在必要时创建简单的DTD文件,因为现在很多的XML应用是建立在DTD之上的。   另外一个代替DTD的就是W3...

经验教程

265

收藏

77
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部