1717# The script will:
1818# 1. Download ANTLR 4.13.2 JAR to /tmp if not present
1919# 2. Clone/update the grammar source repository
20- # 3. Regenerate parser files for all three grammar locations
21- # 4. Clean up generated .interp and .tokens files
20+ # 3. Create a STIX 2.0 grammar variant (without EXISTS operator)
21+ # 4. Regenerate parser files for all three grammar locations
22+ # 5. Clean up generated .interp and .tokens files
2223
2324set -e
2425
@@ -32,13 +33,6 @@ GRAMMAR_FILE="pattern_grammar/STIXPattern.g4"
3233SCRIPT_DIR=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " && pwd) "
3334PROJECT_ROOT=" $( dirname " $SCRIPT_DIR " ) "
3435
35- # Output directories
36- OUTPUT_DIRS=(
37- " ${PROJECT_ROOT} /stix2patterns/grammars"
38- " ${PROJECT_ROOT} /stix2patterns/v20/grammars"
39- " ${PROJECT_ROOT} /stix2patterns/v21/grammars"
40- )
41-
4236echo " === STIX Pattern Validator Grammar Regeneration Script ==="
4337echo " "
4438
8175
8276echo " Using grammar file: ${GRAMMAR_DIR} /${GRAMMAR_FILE} "
8377
84- # Regenerate parser files for each output directory
78+ # Create STIX 2.0 grammar variant (without EXISTS operator, which is v2.1 only)
79+ V20_GRAMMAR_DIR=" /tmp/stix2-v20-grammar"
80+ mkdir -p " $V20_GRAMMAR_DIR "
81+ sed -e ' /| NOT? EXISTS objectPath/d' \
82+ -e " /^EXISTS: 'EXISTS' ;$/d" \
83+ " ${GRAMMAR_DIR} /${GRAMMAR_FILE} " > " ${V20_GRAMMAR_DIR} /STIXPattern.g4"
84+ echo " Created STIX 2.0 grammar variant (without EXISTS operator)"
85+
86+ # Regenerate parser files
8587echo " "
8688echo " Regenerating parser files..."
87- cd " ${GRAMMAR_DIR} /pattern_grammar"
8889
89- for OUTPUT_DIR in " ${OUTPUT_DIRS[@]} " ; do
90- echo " -> ${OUTPUT_DIR} "
90+ # v2.1 grammar (full, with EXISTS) for generic and v21 directories
91+ cd " ${GRAMMAR_DIR} /pattern_grammar"
92+ for OUTPUT_DIR in " ${PROJECT_ROOT} /stix2patterns/grammars" " ${PROJECT_ROOT} /stix2patterns/v21/grammars" ; do
93+ echo " -> ${OUTPUT_DIR} (v2.1 grammar)"
9194 java -jar " $ANTLR_JAR " \
9295 -Dlanguage=Python3 \
9396 STIXPattern.g4 \
9497 -visitor \
9598 -o " $OUTPUT_DIR "
9699done
97100
101+ # v2.0 grammar (without EXISTS) for v20 directory
102+ cd " $V20_GRAMMAR_DIR "
103+ echo " -> ${PROJECT_ROOT} /stix2patterns/v20/grammars (v2.0 grammar)"
104+ java -jar " $ANTLR_JAR " \
105+ -Dlanguage=Python3 \
106+ STIXPattern.g4 \
107+ -visitor \
108+ -o " ${PROJECT_ROOT} /stix2patterns/v20/grammars"
109+
98110# Clean up generated artifacts (not needed for Python runtime)
99111echo " "
100112echo " Cleaning up ANTLR artifacts..."
@@ -104,7 +116,7 @@ find "$PROJECT_ROOT/stix2patterns" -name "*.tokens" -delete
104116# Verify generated files
105117echo " "
106118echo " Verifying generated files..."
107- for OUTPUT_DIR in " ${OUTPUT_DIRS[@]} " ; do
119+ for OUTPUT_DIR in " ${PROJECT_ROOT} /stix2patterns/grammars " " ${PROJECT_ROOT} /stix2patterns/v20/grammars " " ${PROJECT_ROOT} /stix2patterns/v21/grammars " ; do
108120 if [ -f " ${OUTPUT_DIR} /STIXPatternParser.py" ]; then
109121 VERSION=$( head -1 " ${OUTPUT_DIR} /STIXPatternParser.py" | grep -o " ANTLR [0-9.]*" || echo " unknown" )
110122 echo " ${OUTPUT_DIR} : $VERSION "
@@ -114,6 +126,14 @@ for OUTPUT_DIR in "${OUTPUT_DIRS[@]}"; do
114126 fi
115127done
116128
129+ # Verify EXISTS is not in v20 grammar
130+ if grep -q " EXISTS" " ${PROJECT_ROOT} /stix2patterns/v20/grammars/STIXPatternLexer.py" ; then
131+ echo " ERROR: EXISTS found in v20 grammar! This should not happen."
132+ exit 1
133+ else
134+ echo " Verified: EXISTS not present in v20 grammar"
135+ fi
136+
117137echo " "
118138echo " === Grammar regeneration complete! ==="
119139echo " "
0 commit comments