Grammar %header% GRAMMARTYPE = "LL" DESCRIPTION = "A grammar for a simple search text" AUTHOR = "Matthew Dunn" VERSION = "1.0" DATE = "10 June 2003" LICENSE = "" COPYRIGHT = "Copyright (c) 2007 SA Govt" %tokens% SPACE = " " DOUBLEQUOTE = '"' LETTER = <<[A-z0-9]>> BOOLAND = 'AND' BOOLOR = 'OR' BOOLNOT = 'NOT' %productions% CRAP = (WORD|PHRASE|SPACE|BOOLOPERATOR)+; WORD = LETTER+; PHRASE = DOUBLEQUOTE (SPACE|LETTER)+ DOUBLEQUOTE; BOOLOPERATOR = BOOLAND|BOOLOR|BOOLNOT; Example: this NOT is "a search" test OR and some "More test" of this stuff Result: Parse tree from testdata.txt: CRAP(2001) WORD(2002) LETTER(1003): "t", line: 1, col: 1 LETTER(1003): "h", line: 1, col: 2 LETTER(1003): "i", line: 1, col: 3 LETTER(1003): "s", line: 1, col: 4 SPACE(1001): " ", line: 1, col: 5 BOOLOPERATOR(2004) BOOLNOT(1006): "NOT", line: 1, col: 6 SPACE(1001): " ", line: 1, col: 9 WORD(2002) LETTER(1003): "i", line: 1, col: 10 LETTER(1003): "s", line: 1, col: 11 SPACE(1001): " ", line: 1, col: 12 PHRASE(2003) DOUBLEQUOTE(1002): """, line: 1, col: 13 LETTER(1003): "a", line: 1, col: 14 SPACE(1001): " ", line: 1, col: 15 LETTER(1003): "s", line: 1, col: 16 LETTER(1003): "e", line: 1, col: 17 LETTER(1003): "a", line: 1, col: 18 LETTER(1003): "r", line: 1, col: 19 LETTER(1003): "c", line: 1, col: 20 LETTER(1003): "h", line: 1, col: 21 DOUBLEQUOTE(1002): """, line: 1, col: 22 SPACE(1001): " ", line: 1, col: 23 WORD(2002) LETTER(1003): "t", line: 1, col: 24 LETTER(1003): "e", line: 1, col: 25 LETTER(1003): "s", line: 1, col: 26 LETTER(1003): "t", line: 1, col: 27 SPACE(1001): " ", line: 1, col: 28 BOOLOPERATOR(2004) BOOLOR(1005): "OR", line: 1, col: 29 SPACE(1001): " ", line: 1, col: 31 WORD(2002) LETTER(1003): "a", line: 1, col: 32 LETTER(1003): "n", line: 1, col: 33 LETTER(1003): "d", line: 1, col: 34 SPACE(1001): " ", line: 1, col: 35 WORD(2002) LETTER(1003): "s", line: 1, col: 36 LETTER(1003): "o", line: 1, col: 37 LETTER(1003): "m", line: 1, col: 38 LETTER(1003): "e", line: 1, col: 39 SPACE(1001): " ", line: 1, col: 40 PHRASE(2003) DOUBLEQUOTE(1002): """, line: 1, col: 41 LETTER(1003): "M", line: 1, col: 42 LETTER(1003): "o", line: 1, col: 43 LETTER(1003): "r", line: 1, col: 44 LETTER(1003): "e", line: 1, col: 45 SPACE(1001): " ", line: 1, col: 46 LETTER(1003): "t", line: 1, col: 47 LETTER(1003): "e", line: 1, col: 48 LETTER(1003): "s", line: 1, col: 49 LETTER(1003): "t", line: 1, col: 50 DOUBLEQUOTE(1002): """, line: 1, col: 51 SPACE(1001): " ", line: 1, col: 52 WORD(2002) LETTER(1003): "o", line: 1, col: 53 LETTER(1003): "f", line: 1, col: 54 SPACE(1001): " ", line: 1, col: 55 WORD(2002) LETTER(1003): "t", line: 1, col: 56 LETTER(1003): "h", line: 1, col: 57 LETTER(1003): "i", line: 1, col: 58 LETTER(1003): "s", line: 1, col: 59 SPACE(1001): " ", line: 1, col: 60 WORD(2002) LETTER(1003): "s", line: 1, col: 61 LETTER(1003): "t", line: 1, col: 62 LETTER(1003): "u", line: 1, col: 63 LETTER(1003): "f", line: 1, col: 64 LETTER(1003): "f", line: 1, col: 65