IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    坑我两次的左递归

    一根稻草发表于 2015-08-14 00:00:00
    love 0

    人不能在同一个地方跌倒两次
    人不能踏进同一条河流


    呵呵,惨痛的教训! 由于我在简历上提到了flex/bison,两次被面试官问到左递归的概念,第一次是在阿里春招实习生的时候,第二次是前些天阿里内推HR面(审查实习生面试记录)。

    左递归 left-recursive

    A grammar is left-recursive if and only if there exists a nonterminal symbol A that can derive to a sentential form with itself as the leftmost symbol.
    在上下文无关文法G中,一个非终结符P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。

    即

    P => Pa

    左递归根据是直接推导还是间接推导,又分为直接左递归和间接左递归。详细见https://en.wikipedia.org/wiki/Left_recursion

    实例

    最近简单看了下setkey的源码,它在解析配置文件(如/etc/ipsec.conf)时用的就是flex & bison,下面是一个左递归的例子。

        add_command
                :       ADD ipaddropts ipandport ipandport protocol_spec spi extension_spec algorithm_spec EOT
    
        extension_spec
                :       /*NOTHING*/
                |       extension_spec extension
                ;
    
        extension
                :       F_EXT EXTENSION { p_ext |= $2; }
                |       F_EXT NOCYCLICSEQ { p_ext &= ~SADB_X_EXT_CYCSEQ; }
                |       F_MODE MODE { p_mode = $2; }
                |       F_MODE ANY { p_mode = IPSEC_MODE_ANY; }
                |       F_REQID DECSTRING { p_reqid = $2; }
                |       F_REPLAY DECSTRING
    

    即

    extension_spec => NULL
    extension_spec => extension_spec extension

    反应在setkey中的add命令上,它的作用是什么呢?

    extension可以设置多个参数选项

    add 10.10.10.1 10.10.10.2 ah 0x200 -m any -u 1234 -A hmac-md5 0xca2cef3e4e00a0a111d3aa0048ec1ce3;

    上面的两个参数-m any -u 1234均属于extension。



沪ICP备19023445号-2号
友情链接