【问题标题】:Erlang ** exception error: no function clause matchingErlang **异常错误:没有函数子句匹配
【发布时间】:2016-01-07 22:36:28
【问题描述】:

大家好,我已经具备了用于定理证明器的解析器的条件。我有一个模块,它以前对字符串进行标记,所以我输入: [{bracket,open},{prop,a},{logicOp,'and'},{prop,b},{bracket,close}] 到解析器有一个调用内部函数。这是代码:

parse([])-> [];
parse(FullList) ->
    parseClauses(FullList,[],[]).


parseClauses([{bracket, open}| RestOfList], StackList, ParsedList) ->
    parseClauses(RestOfList, 
            StackList ++ [{bracket, open}], 
                ParsedList);

parseClauses([{prop, Any},{logicOp, Any}| RestOfList], StackList, ParsedList) ->
    parseClauses(RestOfList, 
             StackList ++ [{logicOp, Any},{prop, Any}], 
                ParsedList);

parseClauses([{bracket, close}, {logicOp, Any}| RestOfList],StackList,ParsedList) ->
    parseClauses(RestOfList, 
             StackList ++ [{bracket, close}], 
                [{logicOp, Any}] ++ ParsedList);

parseClauses([{bracket, close}|RestOfList], StackList, ParsedList) ->
    parseClauses(RestOfList,
                    StackList++[{bracket, close}],
                        ParsedList);

parseClauses([], Stack, Parsed) ->  Parsed ++ Stack.

像这样在终端上运行代码并得到错误:

tokeniser:parse([{bracket,open},
    {prop,a},
    {logicOp,'and'},
    {prop,b},
    {bracket,close}]).
** exception error: no function clause matching tokeniser:parseClauses([{prop,a},{logicOp,'and'},{prop,b},{bracket,close}],
                                       [{bracket,open}],
                                       [])

【问题讨论】:

    标签: parsing exception erlang


    【解决方案1】:

    从错误信息中,你可以看出函数是这样调用的:

    tokeniser:parseClauses([{prop,a},{logicOp,'and'},{prop,b},{bracket,close}],
                                           [{bracket,open}],
                                           [])
    

    这个几乎匹配这个子句:

    parseClauses([{prop, Any},{logicOp, Any}| RestOfList], StackList, ParsedList) ->
    

    但是由于Any在参数列表中被使用了两次,所以这个子句只在两个值相同时才匹配。在此调用中,它们是不同的:a'and'

    您可以将Any 的两次出现更改为其他内容,例如PropLogicOp,并且该子句将接受两个不同的值。

    【讨论】:

    • 感谢@legoscia,您花时间回答我的问题的好天性使我的一些头发免于被拔掉:)
    猜你喜欢
    • 2021-04-03
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2018-09-03
    • 2018-11-29
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多