小弟想做一个简单的脚本解释的东东,各位大侠给点思路,up有分!!!

时间:2021-02-17 04:39:55
我的脚本的形式是这样的:
if 条件表达式 then
   结果表达式
else
   结果表达式;

说明:
1、if then else 的使用可以嵌套,类似一般编程语言的if 语句的规则,结尾用分号标识‘;’。
2、条件表达式中可以有AND ,OR ,NOT 等逻辑运算符
3、结果表达式为一个单行的四则运算表达式。
4、脚本中可以有多个这样的if then 语句。
我基本上可以解决条件表达式和结果表达式的处理,但对if then else 的处理还没有好的办法,各位高手指点小弟一二,最后有示例代码,^_^!!!

10 个解决方案

#1


最经典的办法是自己做一个解释器,先词法分析,再语法分析,最后语义分析,有经典的算法,看看编译原理就可以知道了:)

#2


谢谢楼上,有没有代码可以借鉴一下的!

#3


自己up!

#4


yacc
lex
bison

你找台 linux / unix 机器 man yacc 看看
或者 http://www.gnu.org/software/bison/bison.html
我觉得这个对你比较合适
毕竟我只听说过有人要写语法分析程序
还没见到有人真正去写出来(例如我^_^)

#5


或者你写个宏吧,也许更快!!

我的代码在家里,现在在公司里,不在身边,没办法,要不然可以发给你看看哦:)

要不,以后再联系?zzyfrank@hotmail.com

#6


单个if else 应是容易处理的, 箝套(加括号或不加括号)的 if else 有些复杂, 要弄清楚每个else所配的是哪一个if.

#7


coffeebike(咖啡色BIKE) ( ) 信誉:100  2002-12-27 11:15:00  得分:0 
 
 
  最经典的办法是自己做一个解释器,先词法分析,再语法分析,最后语义分析,有经典的算法,看看编译原理就可以知道了:)

  
 
同意

#8


递归下降分析很简单:)
void if_function()         
{
   if(Sym == ifSYM) 
   { 
     getSym();
     condition_function();     //条件表达式处理
     if(Sym==thenSYM)  
     {   getSym();
         statement_funtion();    //结果表达式处理
         if(Sym==elseSYM)
            statement_function();
     }
     else Error();           
   }
}

void statement_function()
{
    …………
    …………
    getSym();
   if(Sym==ifSYM)
      if_function();   //递归调用,可以处理箝套
   …………
   …………
}
Sym 表示当前分析的符号
getSym() 取下一个符号

#9


把四则表达式运算处理放在statement_function里
写出语法产生式,一样写递归分析函数

E->T|E+T|E-T
T->F|T*F|T/F
F->(E)|i   

Express_function()
{
    switch( Sym):
    {case (是T的开始符):  Term_function(); break;
     case (是E的开始符):   
                Express_function();
                if(Sym=='+')  { ……}
                else(Sym==‘-’){…… }
                break;
    }
    getSym();


Term_funciton()
{
类似处理^_^
}   
 …………   

#10


谢谢楼上各位!!!

我在这找到了一个可以执行DELPHI代码的控件,有源代码。
http://www.tommstudio.com/newclub30/d_download.asp

我准备就用它了,它可以处理各种语句,使用delphi的函数,功能很强大,值得好好研究一下。




#1


最经典的办法是自己做一个解释器,先词法分析,再语法分析,最后语义分析,有经典的算法,看看编译原理就可以知道了:)

#2


谢谢楼上,有没有代码可以借鉴一下的!

#3


自己up!

#4


yacc
lex
bison

你找台 linux / unix 机器 man yacc 看看
或者 http://www.gnu.org/software/bison/bison.html
我觉得这个对你比较合适
毕竟我只听说过有人要写语法分析程序
还没见到有人真正去写出来(例如我^_^)

#5


或者你写个宏吧,也许更快!!

我的代码在家里,现在在公司里,不在身边,没办法,要不然可以发给你看看哦:)

要不,以后再联系?zzyfrank@hotmail.com

#6


单个if else 应是容易处理的, 箝套(加括号或不加括号)的 if else 有些复杂, 要弄清楚每个else所配的是哪一个if.

#7


coffeebike(咖啡色BIKE) ( ) 信誉:100  2002-12-27 11:15:00  得分:0 
 
 
  最经典的办法是自己做一个解释器,先词法分析,再语法分析,最后语义分析,有经典的算法,看看编译原理就可以知道了:)

  
 
同意

#8


递归下降分析很简单:)
void if_function()         
{
   if(Sym == ifSYM) 
   { 
     getSym();
     condition_function();     //条件表达式处理
     if(Sym==thenSYM)  
     {   getSym();
         statement_funtion();    //结果表达式处理
         if(Sym==elseSYM)
            statement_function();
     }
     else Error();           
   }
}

void statement_function()
{
    …………
    …………
    getSym();
   if(Sym==ifSYM)
      if_function();   //递归调用,可以处理箝套
   …………
   …………
}
Sym 表示当前分析的符号
getSym() 取下一个符号

#9


把四则表达式运算处理放在statement_function里
写出语法产生式,一样写递归分析函数

E->T|E+T|E-T
T->F|T*F|T/F
F->(E)|i   

Express_function()
{
    switch( Sym):
    {case (是T的开始符):  Term_function(); break;
     case (是E的开始符):   
                Express_function();
                if(Sym=='+')  { ……}
                else(Sym==‘-’){…… }
                break;
    }
    getSym();


Term_funciton()
{
类似处理^_^
}   
 …………   

#10


谢谢楼上各位!!!

我在这找到了一个可以执行DELPHI代码的控件,有源代码。
http://www.tommstudio.com/newclub30/d_download.asp

我准备就用它了,它可以处理各种语句,使用delphi的函数,功能很强大,值得好好研究一下。