zoukankan      html  css  js  c++  java
  • 基于文法分析的表达式计算器的实现

    这个基于LL分析器的计算器是大三时上编译原理的一个作业。感觉是自己做过相对比较有深度的一个程序。第一次放出来跟大家分享。希望多多指教。

    这个计算器支持带括号的四则运算和乘方运算。具体实现过程如下:

    词法分析器:

            相关正则定义:

                DIGIT     [0-9]

                NUMBER  {DIGIT}((.{DIGIT}+)|{DIGIT}*)

                DELIM    [ \t\n]

                OPERATOR [+|-|*|/|^|(|)|=]

            识别数值的DFA的状态转换图:

                

            

     

    词法分析器的构造:

                因为要识别表达式中的负数(形如1+ -1),这个工作有两个做法,一个是在词法分析的过程中使得词法分析器可以识别负数。一个是词法分析器只识别正数,让语法分析器去识别负数还是减法运算符。前一种方法不是一个标准的词法分析程序可以完成的,因为它要引用上下文。至少向前看一个字符。这就是LL文法或LR1)文法的范围了。所以使用第二种方案。这也是大多数情况下所采用的方案。

        文法分析器:

            计算器的功能:计划包括含括号的实数四则运算和乘方运算。同时还可以识别出负号。

            初期文法:

     

            

     

    将上述文法消除左递归可得出下面的文法:注意乘方运算是具有右结合性的。而四则运算是左结合的。由于LL分析法本身的限制,要将一个非二义也非左递归的一个产生式:进行转化(因为它有公共的左因子),使其可以用LL分析法进行分析。

               

           

     

    计算出上述文法的FIRST集和FOLLOW集,如下:

     

             

     

     

      

     

     分析表的建立:因为空间原因,表项中只给出产生式的右部

     

    id

    +

    -

    *

    /

    ^

    (

    )

    $

    E

    TE’

     

    TE’

     

     

     

    TE’

     

     

    E’

     

    +TE’

    -TE’

     

     

     

     

    T

    FT’

     

    FT’

     

     

     

    FT’

     

     

    T’

     

    *FT’

    /FT’

     

     

    F

    N

     

    -N

     

     

     

    N

     

     

    N

    MN’

     

     

     

     

     

    MN’

     

     

    N’

     

    ^N

     

    M

    Id

     

     

     

     

     

    (E)

     

     

    文法的分析表

       

     

    文法分析表建立完成之后,就可以开始写程序了。代码如下:

     

    Code

    可以看到,一个简单的计算器就有如此多的步骤。一个复杂的编译器的建立过程,即使有Yacc和Lex等的帮助,也是不容易的。

     

  • 相关阅读:
    果断MARK Flex的那些资源
    利用wamp配置虚拟主机
    wamp+cmd命令行配置zend框架
    [MVVM Light] ViewModelBase
    The WPF Tab Control Inside and Out
    21 Important FAQ questions for WPF and SilverLight
    MIME 多用途互联网邮件扩展
    The Future of Client App Dev : WPF and Silverlight Convergence
    View 中DataContext的设置问题
    [MVVM Light]Messenger 的使用
  • 原文地址:https://www.cnblogs.com/nankezhishi/p/1337930.html
Copyright © 2011-2022 走看看