星号:用“ast_yyerror”

我有一个间歇性的问题,星号将打给我们的问候,然后打电话,而不是让我们的电话响。

我无法用我在这里的任何电话重现问题,并且许多呼叫者通过很好。 有些来电者遇到问题,我找不到任何模式。

我能find的那一点信息说是由于评估一个拨号schemeexpression式时出错。 我在想这是这一行:

 exten => START,n,GotoIf($ [$ {FORCE_CLOSED} = TRUE] CLOSED,1)

但我不确定它有什么问题。

我在控制台上看到以下错误:

 [4月4日16:29:49]警告[27038]:ast_expr2.fl:459 ast_yyerror:ast_yyerror():语法错误:语法错误,意外的'=',期待$结束; input:= TRUE ^

周围的控制台输出:

 - 执行[START @ AGInbound:1]新堆栈中的回答(“IAX2 / AtlantaTeliax-10086”,“”)
 - 在新堆栈中执行[START @ AGInbound:2] BackGround(“IAX2 / AtlantaTeliax-10086”,0000_AG_THANK_YOU_FOR_CALLING_AG)
 - 播放“0000_AG_THANK_YOU_FOR_CALLING_AG.slin”(语言“en”)
 [4月4日16:29:49]警告[27038]:ast_expr2.fl:459 ast_yyerror:ast_yyerror():语法错误:语法错误,意外的'=',期待$结束; input:
 = TRUE
 ^
 [Apr 4 16:29:49]警告[27038]:ast_expr2.fl:463 ast_yyerror:如果您有疑问,请参考星号源中的doc / tex / channelvariables.tex。
     - 在新堆栈中执行[START @ AGInbound:3] GotoIf(“IAX2 / AtlantaTeliax-10086”,“?CLOSED,1”)
     - 在新堆栈中执行[START @ AGInbound:4] GotoIfTime(“IAX2 / AtlantaTeliax-10086”,“9:30-17:0 | mon-fri | * | *?OPEN,1”)
     - 在新堆栈中执行[START @ AGInbound:5] GotoIfTime(“IAX2 / AtlantaTeliax-10086”,“10:0-18:30 | sat | * | *?OPEN,1”
     - 在新堆栈中执行[START @ AGInbound:6] GotoIfTime(“IAX2 / AtlantaTeliax-10086”,“12:0-17:0 | sun | * | *?OPEN,1”)

拨号计划的相关线路:

 exten => START,1,Answer()
 exten => START,n,后台(0000_AG_THANK_YOU_FOR_CALLING_AG)

 ; 看看我们是否开放
 ; 如果没有人会回答,强制closures
 exten => START,n,GotoIf($ [$ {FORCE_CLOSED} = TRUE] CLOSED,1)

 exten => START,n,GotoIfTime($ {AG_WEEKDAY_OPEN_HOUR}:$ {AG_WEEKDAY_OPEN_MIN}  -  $ {AG $
 exten => START,n,GotoIfTime($ {AG_SATURDAY_OPEN_HOUR}:$ {AG_SATURDAY_OPEN_MIN}  -  $ {$
 exten => START,n,GotoIfTime($ {AG_SUNDAY_OPEN_HOUR}:$ {AG_SUNDAY_OPEN_MIN}  -  $ {AG_S $
 ;  ...而我们不是。 但是,也许一天的时间已被覆盖?
 exten => START,n,GotoIf($ [$ {OVERRIDE_TIME_OF_DAY} = TRUE]?OPEN,1)
 ; 没有覆盖...我们正在closures。
 exten => START,n,Goto(CLOSED,1)

任何想法有什么问题的expression? 我们最近从1.4升级到1.6。

在Asterisk $[]expression式中,未定义variables不会返回隐式空string或零。 在评估expression式之前,它们扩展为“无”,所以在variables被展开之后(没有),expression式parsing器是不可见的。 这导致了Pablo Alsina已经注意到的错误:

 GotoIf("IAX2/AtlantaTeliax-10086", "?CLOSED,1") 

有两种方法可以避免这种情况:

  1. 在使用它们之前总是给你的variables合理的默认值(如Pablobuild议的)。
  2. 在任何$[]expression式中,用双引号括起你的variables和文字。 这会导致一个未定义的variables被作为一个空string处理,这仍然可以用于比较目的。

就我个人而言,我试图做到这一点。 例如:

 exten => START,n,Set(FORCE_CLOSED=FALSE) exten => START,n,GotoIf($["${FORCE_CLOSED}"="TRUE"]?CLOSED,1) 

请注意${FORCE_CLOSED}和比较值之间的双引号。 即使variables未定义,expression式也会有"" (一个空string)与"TRUE"进行比较。

真的,你可以使用任何你喜欢的angular色,因为它只会被添加到variables扩展中。 它只是给你一个字面值,保证在variables未定义的情况下。 我喜欢引用,因为它使得代码与其他编程语言相似。 您可以像使用Bourne shell脚本中常见的$[x${FORCE_CLOSED}=xTRUE]一样轻松使用。 最终的结果是一样的。

这是我能告诉你的。

yyerror是由yacc生成的parsing器的错误。

错误抱怨=。 所以看来,在这一行上,=是一个语法不支持的构造。

祝你好运在serverfault.com这个问题是朝着…

谁定义$ {FORCE_CLOSED}?

从我所看到的看来,这个variables有时候并没有得到一个初始值,然后当你评估的时候,这个parsing器会产生错误

 GotoIf("IAX2/AtlantaTeliax-10086", "?CLOSED,1") 

检查引发错误的调用对于FORCE_CLOSED是否有合理的值