gstreamer_core/gst/parse/parse.l
changeset 2 5505e8908944
parent 0 0e761a78d257
child 8 4a7fac7dd34a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gstreamer_core/gst/parse/parse.l	Fri Jan 22 09:59:59 2010 +0200
@@ -0,0 +1,154 @@
+%{
+
+#include <math.h>
+#include <string.h>
+
+#include <glib/gprintf.h>
+
+#include "../gst_private.h"
+
+#include "types.h"
+#include "../gstinfo.h"
+#include "../gsturi.h"
+#include "grammar.tab.h"
+
+#ifdef __SYMBIAN32__
+#include <glib_global.h>
+#include <gobject_global.h>
+#endif
+
+/* Override the default ECHO so as to avoid fortify warnings. Ignore the
+   embedded-NUL case for now. We know yytext is NUL-terminated. */
+#define ECHO g_fprintf(yyout, "%s", yytext)
+
+#ifdef G_HAVE_ISO_VARARGS
+#define PRINT(...) GST_CAT_DEBUG (GST_CAT_PIPELINE, "flex: " __VA_ARGS__)
+#elif defined(G_HAVE_GNUC_VARARGS)
+#define PRINT(args...) GST_CAT_DEBUG (GST_CAT_PIPELINE, "flex: " args)
+#else
+static inline void
+PRINT (const char *format, ...)
+{
+  va_list varargs;
+
+  va_start (varargs, format);
+  GST_CAT_LEVEL_LOG_valist (GST_CAT_PIPELINE, GST_LEVEL_DEBUG, NULL,
+    format, varargs);
+  va_end (varargs);
+}
+#endif
+
+%}
+
+_operator [(){}.!,;=]
+_identifier [[:alpha:]][[:alnum:]\-_%:]*
+
+_char ("\\".)|([^[:space:]])
+_string {_char}+|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\'")*"'")
+
+_assign [[:space:]]*"="[[:space:]]*
+
+_protocol [[:alpha:]][[:alnum:]+-\.]*
+_url ({_protocol}"://"{_string}|["."{_identifier}]?"/"{_string})|({_protocol}"://")
+
+/* we must do this here, because nearly everything matches a {_string} */ 
+_assignment {_identifier}{_assign}{_string}
+
+/* get pad/element references and stuff with dots right */
+_padref "."{_identifier}
+_ref {_identifier}"."{_identifier}?
+_binref {_identifier}[[:space:]]*"."[[:space:]]*"("
+
+/* links */
+_mimechar [[:alnum:]-]
+_mimetype {_mimechar}+"/"{_mimechar}+
+_capschar ("\\".)|([^\;!])
+_capsstring {_capschar}+
+_caps {_mimetype}(","[^!]|{_capsstring})*
+_link ("!"[[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)*"!")|("!")
+
+%x value
+%option noyywrap
+%option nounput
+%option reentrant
+%option bison-bridge
+%option never-interactive
+%option noinput
+%%
+
+{_assignment} {
+    /* "=" */
+    PRINT ("ASSIGNMENT: %s", yytext);
+    yylval->s = gst_parse_strdup (yytext);
+    BEGIN (INITIAL);
+    return ASSIGNMENT;
+}
+
+{_padref} {
+    yytext++;
+    PRINT ("PADREF: %s", yytext);
+    yylval->s = gst_parse_strdup (yytext);
+    BEGIN (INITIAL);
+    return PADREF;
+}
+
+{_ref} {
+    PRINT ("REF: %s", yytext);
+    yylval->s = gst_parse_strdup (yytext);
+    BEGIN (INITIAL);
+    return REF;
+}
+
+{_binref} {
+    gchar *pos = yytext;
+    while (!g_ascii_isspace (*pos) && (*pos != '.')) pos++;
+    *pos = '\0';
+    PRINT ("BINREF: %s", yytext);
+    yylval->s = gst_parse_strdup (yytext);
+    BEGIN (INITIAL);
+    return BINREF;
+}
+
+{_identifier} {
+    PRINT ("IDENTIFIER: %s", yytext);
+    yylval->s = gst_parse_strdup (yytext);
+    BEGIN (INITIAL);
+    return IDENTIFIER;
+}
+
+{_link} {
+    gchar *c = yytext;
+    PRINT ("LINK: %s", yytext);
+    c++;
+    if (*c) {
+      while (g_ascii_isspace (*c)) c++;
+      c = yylval->s = gst_parse_strdup (c);
+      while (*c) c++;
+      if (*--c != '!')
+	g_assert_not_reached ();
+      while (g_ascii_isspace (*--c));
+      *++c = '\0';
+    } else {
+      yylval->s = NULL;
+    }
+    BEGIN (INITIAL);
+    return LINK;
+}
+{_url} {
+  PRINT ("URL: %s", yytext);
+  yylval->s = g_strdup (yytext);
+  gst_parse_unescape (yylval->s);
+  BEGIN (INITIAL);
+  return PARSE_URL;
+}
+
+{_operator} { PRINT ("OPERATOR: [%s]", yytext); return *yytext; }
+
+[[:space:]]+ { PRINT ("SPACE: [%s]", yytext); }
+
+. {
+    PRINT ("Invalid Lexer element: %s\n", yytext);
+    return *yytext;
+}
+
+%%