`
mryufeng
  • 浏览: 982363 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

分析表达式警告的原因

阅读更多
erlang的表达式如果不用的话,会警告的,但是有些又不警告,比较奇怪,做了下试验,再看了compiler的源码有了以下的结果:

root@yufeng-desktop:~# nl expr.erl
     1  -module(expr).
     2  -export([test/0]).
     3  test()->
     4      1,
     5      1.0,
     6      [],
     7      [1,2,3],
     8      <<>>,
     9      <<1,2,3>>,
    10      c:pid(0,1,2),
    11      make_ref(),
    12      atom,
    13      fun()-> ok end,
    14      open_port({spawn, "cat"}, [in, out]),
    15      "hello",
    16      "",
    17      {1,2,3},
    18      {},
    19      true,
    20      false,
    21      1.
    22     
root@yufeng-desktop:~# erlc +return expr.erl
./expr.erl:4: Warning: a term is constructed, but never used
./expr.erl:5: Warning: a term is constructed, but never used
./expr.erl:7: Warning: a term is constructed, but never used
./expr.erl:8: Warning: a term is constructed, but never used
./expr.erl:9: Warning: a term is constructed, but never used
./expr.erl:11: Warning: the call to make_ref/0 has no effect
./expr.erl:13: Warning: a term is constructed, but never used
./expr.erl:15: Warning: a term is constructed, but never used
./expr.erl:17: Warning: a term is constructed, but never used
./expr.erl:18: Warning: a term is constructed, but never used
Compiler function compile:compile/3 returned:
{ok,expr,
    [{"./expr.erl",
      [{4,sys_core_fold,useless_building},
       {5,sys_core_fold,useless_building},
       {7,sys_core_fold,useless_building},
       {8,sys_core_fold,useless_building},
       {9,sys_core_fold,useless_building},
       {11,sys_core_fold,{no_effect,{erlang,make_ref,0}}},
       {13,sys_core_fold,useless_building},
       {15,sys_core_fold,useless_building},
       {17,sys_core_fold,useless_building},
       {18,sys_core_fold,useless_building}]}]}

看下lib/compiler/src/sys_core_fold.erl的源代码:

expr(#c_literal{val=Val}=L, Ctxt, _Sub) ->
    case Ctxt of
        effect ->
            case Val of
                [] ->
                    %% Keep as [] - might give slightly better code.                                                               
                    L;
                _ when is_atom(Val) ->
                    %% For cleanliness replace with void().                                                                        
                    void();
                _ ->
                    %% Warn and replace with void().                                                                               
                    add_warning(L, useless_building),
                    void()
            end;
        value -> L
    end;
expr(#c_cons{anno=Anno,hd=H0,tl=T0}=Cons, Ctxt, Sub) ->
    H1 = expr(H0, Ctxt, Sub),
    T1 = expr(T0, Ctxt, Sub),
    case Ctxt of
        effect ->
            add_warning(Cons, useless_building),
            expr(make_effect_seq([H1,T1], Sub), Ctxt, Sub);
        value ->
            ann_c_cons(Anno, H1, T1)
    end;
expr(#c_tuple{anno=Anno,es=Es0}=Tuple, Ctxt, Sub) ->
    Es = expr_list(Es0, Ctxt, Sub),
    case Ctxt of
        effect ->
           add_warning(Tuple, useless_building),
            expr(make_effect_seq(Es, Sub), Ctxt, Sub);
        value ->
            ann_c_tuple(Anno, Es)
    end;

expr(#c_binary{segments=Ss}=Bin0, Ctxt, Sub) ->
    %% Warn for useless building, but always build the binary                                                                      
    %% anyway to preserve a possible exception.                                                                                    
    case Ctxt of
        effect -> add_warning(Bin0, useless_building);
        value -> ok
    end,
    Bin1 = Bin0#c_binary{segments=bitstr_list(Ss, Sub)},
    Bin = bin_un_utf(Bin1),
    eval_binary(Bin);

expr(#c_fun{}=Fun, effect, _) ->
    %% A fun is created, but not used. Warn, and replace with the void value.                                                      
   add_warning(Fun, useless_building),
    void();

得出的结论是:
如果编译器能够明确的知道你表达式的值的话,除非这几个东西 atom, [], boolean 不警告以外,其他无用的一律警告, 而且尽可能的不产生代码。 这就解释为什么大部分的函数返回值是 原子或者 [].



分享到:
评论
1 楼 litaocheng 2009-05-24  
恩,很好,这个编译器也一目了然。。

相关推荐

    自定义控件[正则表达式编辑器]-C#

    这可以通过分析正则表达式并调用Regex类的静态方法如CompileToAssembly来预估性能影响。 最后,为了方便其他开发者在项目中使用这个自定义控件,我们需要将其打包成一个NuGet包或DLL库,并提供详细的文档和示例代码...

    易语言编译原理的表达式解析

    易语言的源码中可能包含各种表达式,如算术表达式、比较表达式和逻辑表达式等,这些都需要经过词法分析进行识别。 接下来是语法分析,也叫解析,它将词法分析得到的标记序列按照易语言的语法规则构造出抽象语法树...

    GNU regex 正则表达式 修正版

    GNU regex正则表达式修正版是对原GNU regex 0.13版本的改进,主要解决了在编译过程中出现的大批量警告错误。这个修正版不仅优化了源代码,提高了代码质量,还增强了其兼容性,使其能够顺利在Windows和Linux两大操作...

    Javascript正则表达式测试网页.docx

    - `check`函数首先将标志转换为小写,然后检查标志是否只包含g、i、m,如果不是,将弹出警告并停止执行。 - 使用`RegExp`构造函数创建正则表达式对象,并通过`toString()`方法获取其字符串表示。 - 根据`method`...

    LL1预测分析和算符优先分析程序(语法分析程序)(VC++)

    ".PLG"文件记录了编译过程中的错误和警告信息。 通过分析并运行这个项目,不仅可以了解LL1预测分析和算符优先分析的基本原理,还可以学习到如何在实际编程环境中实现这些理论,这对于理解和设计编译器具有重要的...

    在Linux下正则表达式和grep命令的使用

    通过使用正则表达式,系统管理员可以有效地过滤和分析这些日志,只关注那些关键或异常的条目,比如安全警报或系统错误。这极大地提高了故障排查和安全管理的效率。 ### 正则表达式的广泛应用 正则表达式不仅仅局限...

    测试正则表达式

    - **安全警告**:在安装任何未知来源的软件时,应先阅读文档,确认没有病毒或恶意软件风险。 - **许可协议**:了解软件的许可条款,确保合法使用。 - **更新与维护**:关注软件更新,以获取新功能和修复的bug。 ...

    正则表达式总结

    3. **awk**:一种强大的文本分析工具,支持复杂的正则表达式模式匹配。 4. **sed**:流编辑器,能够对文本进行模式匹配和替换操作。 #### 四、grep命令详解 ##### 基础使用 - `grep [选项] '搜索字符串' 文件名` ...

    Android日志过滤器中正则表达式的应用.pdf

    这种按级别筛选的方法结合正则表达式的使用,可以使开发者更有效地管理和分析日志,从而提升开发和调试的效率。 总结来说,掌握正则表达式在Android日志过滤器中的应用,对于Android应用开发者来说,是提高工作效率...

    java文件读写和正则表达式检索字符次位.pdf

    1. 日志分析:通过读取日志文件,使用正则表达式匹配特定错误或警告信息,有助于问题排查。 2. 数据处理:读取文本文件,对数据进行过滤、替换或提取,例如从大量数据中找出满足条件的记录。 3. 文件搜索:在多个...

    calculate.zip_Qt 表达式计算_qt 计算器_qt计算器_计算器_计算器 qt

    可以使用词法分析(lexing)和语法分析(parsing)技术,例如使用正则表达式匹配操作符和数字,构建一个抽象语法树(AST)。在Qt中,我们可以自定义类实现这些功能,或者使用现有的库如QtScript或QExpression。 4. ...

    bianyiyuanli.rar_C语义分析_语义分析

    在C语言中,语义分析会检查所有表达式的类型是否正确,比如运算符的操作数类型是否匹配,以及表达式的结果类型是否符合上下文要求。例如,整型与浮点型的混合运算需要进行类型转换,而不同类型之间的赋值也需要进行...

    java词法分析器_ - Java - Java_开发文档.rar_java 词法分析_java词法分析_词法分析_词法分析 j

    6. **词法分析与错误处理**:在词法分析过程中,如果遇到不符合规则的字符序列,词法分析器需要进行错误处理,通常包括发出错误警告、跳过错误部分并尝试继续解析或直接终止解析。 7. **词法分析与语法分析的交互**...

    语义分析器—编译原理

    8. 错误处理:当语义分析器检测到错误或警告时,需要生成有意义的错误消息并报告给用户。 通过深入学习和实践语义分析,开发者不仅可以编写出更高效、更可靠的编译器,还能对编程语言的底层机制有更深刻的理解,...

    邮箱验证(javascript中的正则表达式)

    #### 示例代码分析 下面是对给定示例代码的详细解析: ```javascript function checkemail() { var temp = document.getElementById("email"); var myreg = /(\S)+[@]{1}(\S)+[.]{1}(\w)+/; if (temp.value !...

    C++语义分析器

    2. **表达式求值**:虽然简单的算术运算在语法分析阶段可能已经被解析为抽象语法树(AST),但语义分析会进一步处理这些表达式,如计算常量表达式的值,或者确定变量的最终类型。 3. **作用域解析**:语义分析器还...

    编译原理词法分析器C#

    在C#中,可以使用`System.Text.RegularExpressions`命名空间来处理正则表达式,或者自定义一个有限状态机类来实现词法分析。 为了测试词法分析器,我们通常会提供一系列输入样本,观察输出的标记序列是否符合预期。...

Global site tag (gtag.js) - Google Analytics