[svn-commits] murf: branch murf/fast-ast r41164 - in /team/murf/fast-ast: GOALS main/ast_var.y

svn-commits at lists.digium.com svn-commits at lists.digium.com
Fri Aug 25 20:23:02 MST 2006


Author: murf
Date: Fri Aug 25 22:23:01 2006
New Revision: 41164

URL: http://svn.digium.com/view/asterisk?rev=41164&view=rev
Log:
Changed goals just a bit.
After actually studying the code to evaluate
variable references, I've jotted down some basic
syntax for them. And modified my goals a little.
I'm now thinking about merging $[] and ${} into
a master string expr sort of thing... SNOBOL, anyone? 
(Just kidding!). I'm leaning toward preserving 
current syntax as much as possible.


Added:
    team/murf/fast-ast/main/ast_var.y   (with props)
Modified:
    team/murf/fast-ast/GOALS

Modified: team/murf/fast-ast/GOALS
URL: http://svn.digium.com/view/asterisk/team/murf/fast-ast/GOALS?rev=41164&r1=41163&r2=41164&view=diff
==============================================================================
--- team/murf/fast-ast/GOALS (original)
+++ team/murf/fast-ast/GOALS Fri Aug 25 22:23:01 2006
@@ -1,6 +1,16 @@
 Steps to speeding up the Asterisk dialplan engine:
 
 1. A 'formal' parser for ${ } expressions, with a parse-tree representation.
+   Goals change a bit... the current method repetitively scans the string
+   for ${} and $[] occurrences, and finds the matching closing bracket, and
+   recursively processes it until all such exprs are cut out, evaluated,
+   and the results pasted in their place.
+
+   After sitting and thinking a bit, for the sake of speedup, I'm going
+   to unify these two parsers into a single entity. Sorry, but what I'm
+   thinking about right now, is not exactly compatible with the current
+   syntax, which reminds me a bit of sh. This is OK for interpreters, but
+   I want something faster than that... we need to bind earlier. Sorry.
 
 2. See how much of a speedup from  hash-table for func/app names.
 
@@ -15,4 +25,4 @@
    structs, or, we can traverse the dialplan and remove ptrs associated with the
    removed app.
 
-4. Profit.
+4. Profit!!!!

Added: team/murf/fast-ast/main/ast_var.y
URL: http://svn.digium.com/view/asterisk/team/murf/fast-ast/main/ast_var.y?rev=41164&view=auto
==============================================================================
--- team/murf/fast-ast/main/ast_var.y (added)
+++ team/murf/fast-ast/main/ast_var.y Fri Aug 25 22:23:01 2006
@@ -1,0 +1,135 @@
+%{
+#include "asterisk.h"
+
+#ifndef STANDALONE
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+#endif
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <unistd.h>
+#include <ctype.h>
+#if !defined(SOLARIS) && !defined(__CYGWIN__)
+#include <err.h>
+#else
+#define quad_t int64_t
+#endif
+#include <errno.h>
+#include <regex.h>
+#include <limits.h>
+
+
+enum parttype {
+	PART_VARREF = 1,
+	PART_FUNC = 2,
+	PART_VARNAME = 3,
+	PART_SUBSTR = 4,
+	PART_STR = 5
+};
+
+
+
+struct part {
+	enum parttype type;
+
+	/* fields for VARREF:
+	   u1: name (func or varname or varref)
+	   u2: substr
+	   
+	   FUNC:
+	   u1: ref (func or varname or varref)
+	   u2: arglist
+	   u3: substr
+
+	   VARNAME:
+	   u1: ref (func or varname or varref)
+	   u2: substr
+
+	   STR:
+	   u1: string (char*) -- constant
+
+	   SUBSTR
+	   u1: offset  --- NOTE: these can be exprs to! 
+	   u2: length
+	*/
+
+	union 
+	{
+		struct part *name;
+		struct part *ref;
+		char *string;
+		int offset;
+	} u1;
+
+	union 
+	{
+		struct part *substr;
+		struct part *arglist;
+		int length;
+	} u2;
+
+	union 
+	{
+		struct part *substr;
+	} u2;
+	
+	struct part *next; /* to next arg */
+};
+
+struct part *new_part(enum parttype type);
+
+%}
+
+
+%union 
+{
+	struct part *part;
+}
+	 
+
+
+
+%left <part> DOLL LCURLY RCURLY LPAR RPAR COLON COMMA
+%left <part> Name Num
+
+%type <part> varref thing substr args arg 
+
+%%
+
+varref : DOLL LCURLY  thing RCURLY {}
+       ;
+
+
+thing : varref substr {$$=new_part(PART_VARNAME);$$->u1.ref=$1;}
+      | arg substr {$$=new_part(PART_VARNAME);$$->u1.ref=$1;$$->}
+      | arg LPAR args RPAR substr {$$=new_part(PART_FUNC);$$->u1.ref=$1; $$->u2.arglist=$3;}
+      | arg LPAR RPAR substr {$$=new_part(PART_FUNC);$$->u1.ref=$1; $$->u2.arglist=0; }
+      ;
+
+substr : /* nothing */ { $$ = 0; }
+       | COLON Num {$$ = new_part(PART_SUBSTR); $$->u1.offset = $2; $$->u2.length = MAX_INT;}
+       | COLON Num COLON Num {$$ = new_part(PART_SUBSTR); $$->u1.offset = $2; $$->u2.length = $4;}
+       ;
+
+args : arg {$$=$1;}
+     | args COMMA arg { $$=$1; $$->next = $3;}
+	 ;
+
+arg : Name {$$=new_part(PART_STR); $$->u1.string=$1;}
+    | Num {char numbuf[40]; $$=new_part(PART_STR); sprintf(numbuf,"%d",$1); $$->u1.string=strdup(numbuf);}
+	| varref {$$=$1;}
+    ;
+
+
+
+%%
+
+struct part *new_part(enum parttype type)
+{
+	struct part *x = (struct part *)calloc(1,sizeof(struct part));
+	x->type = type;
+	return x;
+}

Propchange: team/murf/fast-ast/main/ast_var.y
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/murf/fast-ast/main/ast_var.y
------------------------------------------------------------------------------
    svn:keywords = Author Id Date Revision

Propchange: team/murf/fast-ast/main/ast_var.y
------------------------------------------------------------------------------
    svn:mime-type = text/plain



More information about the svn-commits mailing list