expr_parser: support ':' operator

Similar to '==' but compiles the RHS into a regular expression
and attempts to match whatever is in the environment against it.

Change-Id: I7a03452ef88d067b62661d14dc6f42273de436fa
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
diff --git a/scripts/expr_parser.py b/scripts/expr_parser.py
index 91aaa55..3047553 100644
--- a/scripts/expr_parser.py
+++ b/scripts/expr_parser.py
@@ -18,6 +18,7 @@
 import os
 import copy
 import threading
+import re
 
 try:
     import ply.lex as lex
@@ -51,6 +52,7 @@
     "CBRACKET",
     "COMMA",
     "SYMBOL",
+    "COLON",
 ] + list(reserved.values())
 
 def t_HEX(t):
@@ -91,6 +93,8 @@
 
 t_COMMA = r","
 
+t_COLON = ":"
+
 def t_SYMBOL(t):
     r"[A-Za-z_][0-9A-Za-z_]*"
     t.type = reserved.get(t.value, "SYMBOL")
@@ -133,7 +137,8 @@
             | SYMBOL LT number
             | SYMBOL GTEQ number
             | SYMBOL LTEQ number
-            | SYMBOL IN list"""
+            | SYMBOL IN list
+            | SYMBOL COLON STR"""
     p[0] = (p[2], p[1], p[3])
 
 def p_expr_single(p):
@@ -204,6 +209,8 @@
         return ast_sym(ast[1], env) in ast[2]
     elif ast[0] == "exists":
         return True if ast_sym(ast[1], env) else False
+    elif ast[0] == ":":
+        return True if re.compile(ast[2]).match(ast_sym(ast[1], env)) else False
 
 mutex = threading.Lock()
 
diff --git a/scripts/sanitycheck b/scripts/sanitycheck
index 1d849be..3b80d0c 100755
--- a/scripts/sanitycheck
+++ b/scripts/sanitycheck
@@ -80,6 +80,7 @@
                  | symbol ">=" number
                  | symbol "<=" number
                  | symbol "in" list
+                 | symbol ":" string
                  | symbol
 
     list ::= "[" list_contents "]"
@@ -110,6 +111,14 @@
 
         filter = not ARCH in ["x86", "arc"]
 
+    The ':' operator compiles the string argument as a regular expression,
+    and then returns a true value only if the symbol's value in the environment
+    matches. For example, if CONFIG_SOC="quark_se" then
+
+        filter = CONFIG_SOC : "quark.*"
+
+    Would match it.
+
 Architectures and platforms are defined in an archtecture configuration
 file which are stored by default in scripts/sanity_chk/arches/. These
 each define an [arch] block with the following key/value pairs: