diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..279feb85d5efbe4d82139a4466c2a6971e954f0c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,12 @@
+# Install dependencies
+pip3 install --user rdflib-jsonld rdflib anytree
+
+# Create grammar
+
+# Download recipes
+
+# Parse recipes
+
+# Create ontology
+
+# Show ontology on website
diff --git a/create_ontology.py b/create_ontology.py
new file mode 100755
index 0000000000000000000000000000000000000000..b73ca37499050fb464936029bc8019473ac386e9
--- /dev/null
+++ b/create_ontology.py
@@ -0,0 +1,69 @@
+from rdflib import Graph, plugin
+from rdflib.serializer import Serializer
+
+bbc = """
+@prefix dc:  <http://purl.org/dc/elements/1.1/> .
+<> dc:title "Ontology" .
+
+@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix owl:  <http://www.w3.org/2002/07/owl#> .
+
+@prefix : <#> .
+
+:Ingredient a rdfs:Class.
+:Collection a rdfs:Class.
+:Menu a rdfs:Class; rdfs:subClassOf :Collection.
+:Recipe a rdfs:Class.
+:Food a rdfs:Class.
+:StageSequence a rdfs:Class.
+
+:hasAllergens a rdfs:Property.
+"""
+
+
+# - Collection
+#     - Menu
+#             - Recipe
+#                     - Food
+#                             - StageSequence
+#                                         - Seq
+#                                                     - IngredientList
+#                                                                     - Ingredient
+#                                                                                         - Amount
+#                                                                                                             - Unit
+#                                                                                                                                 - Name
+#                                                                                                                                                     - Type
+#                                                                                                                                                                             - Vegetable
+#                                                                                                                                                                                         - Method
+#                                                                                                                                                                                                         - Step
+#                                                                                                                                                                                                                             - Action
+#                                                                                                                                                                                                                                                     - Verb
+#                                                                                                                                                                                                                                                                                 - Ingredient etc
+#
+#
+# - Menu subClassOf Collection
+# - Menu canape Recipe etc
+# - Recipe produces Food
+# - Recipe stages StageSequence
+# - hasName
+# - hasURLSource
+# - hasAuthor
+# - hasWebsite
+# - hasRating
+# - hasDifficulty
+# - hasNoIngredients
+#     - number of ingredients
+#     - hasIngredientsList
+#         - isVegetable
+#                 - Or has type vegetable / fruit whatever
+#                     - isAllergen
+#                     - hasAllergens
+#                     - hasRelatedRecipes
+#                                                                                                                                                                                                                                                                                                     
+
+g = Graph().parse(data=bbc, format='n3')
+
+context = {"@vocab": "http://purl.org/dc/terms/", "@language": "en"}
+
+print(g.serialize(format='json-ld', context=context, indent=4).decode())
diff --git a/database/recipes/vegancupcakes.json b/database/recipes/vegancupcakes.json
deleted file mode 100644
index 762853c486d581742883587a4573f97db710a2d7..0000000000000000000000000000000000000000
--- a/database/recipes/vegancupcakes.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Name":"Vegan cupcakes","Ingredients":["150ml almond or soy milk","½ tsp cider vinegar","110g vegan butter or sunflower spread","110g caster sugar","1 tsp vanilla extract","110g self-raising flour","½ tsp baking powder","125g vegan butter","250g icing sugar","1¼ tsp vanilla extract","a few drops of vegan food colourings (check the label)"],"Steps":["Heat the oven to 180C/160C fan/gas 4. Line the holes of a 12-hole cupcake tin with paper cases. Stir the milk and vinegar in a jug and leave to thicken slightly for a few mins.","Beat the butter and sugar with an electric whisk until well combined. Whisk in the vanilla, then add the milk a splash at a time, alternating with spoonfuls of the flour. Fold in any remaining flour, the baking powder and a pinch of salt until you get a creamy batter. Don’t worry if it looks a little curdled at this stage.","Divide between the cupcake cases, filling them two-thirds full, and bake for 20 - 25 mins until golden and risen. Leave to cool on a wire rack.","To make the buttercream, beat the butter, icing sugar and vanilla with an electric whisk until pale and creamy. Divide between bowls and colour with different food colourings until you get desired strength. Spoon or pipe onto the cooled cupcakes."],"Yield":"Makes 12","Difficulty":"Easy","Preparation":"30 mins","Cook":"20 mins","Nutrition":{"Kcal":"265","Fat":"12g","Saturates":"3g","Carbs":"","Sugars":"30g","Fibre":"0.4g","Protein":"1g","Salt":"0.28g"}}
diff --git a/database/units.json b/database/units.json
deleted file mode 100644
index b1c0d045ecded003c22b31992de2c7b5a0c8c6a3..0000000000000000000000000000000000000000
--- a/database/units.json
+++ /dev/null
@@ -1,208 +0,0 @@
-[
-    {
-        "author": "Liam Esteban Prince",
-        "description": "units used in cooking recipes",
-        "source": "wikibooks cookbook units of measurement"
-        "source_url": ""
-    },
-  {
-    "Unit": "gram",
-    "Alternative": "g",
-    "Alternative__1": "gr",
-    "Alternative__2": "gram",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "miligram",
-    "Alternative": "miligramme",
-    "Alternative__1": "mg",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "kilogram",
-    "Alternative": "kilogramme",
-    "Alternative__1": "kg",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "tablespoon",
-    "Alternative": "tbsp",
-    "Alternative__1": "T",
-    "Alternative__2": "tbs",
-    "Alternative__3": "tbl",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "teaspoon",
-    "Alternative": "tsp",
-    "Alternative__1": "t",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "fluid ounce",
-    "Alternative": "fl oz",
-    "Alternative__1": "",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "ounce",
-    "Alternative": "oz",
-    "Alternative__1": "",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "cup",
-    "Alternative": "c",
-    "Alternative__1": "",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "slice",
-    "Alternative": "",
-    "Alternative__1": "",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "half",
-    "Alternative": "",
-    "Alternative__1": "",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "entire",
-    "Alternative": "",
-    "Alternative__1": "",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "milimetre",
-    "Alternative": "milimeter",
-    "Alternative__1": "mm",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "centiimetre",
-    "Alternative": "centimeter",
-    "Alternative__1": "cm",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "metre",
-    "Alternative": "meter",
-    "Alternative__1": "cm",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "inch",
-    "Alternative": "in",
-    "Alternative__1": "",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "millilitre",
-    "Alternative": "milliliter",
-    "Alternative__1": "cc",
-    "Alternative__2": "ml",
-    "Alternative__3": "mL",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "centilitre",
-    "Alternative": "centiliter",
-    "Alternative__1": "",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "decilitre",
-    "Alternative": "deciliter",
-    "Alternative__1": "dL",
-    "Alternative__2": "d;",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "celsius",
-    "Alternative": "c",
-    "Alternative__1": "",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "pound",
-    "Alternative": "lb",
-    "Alternative__1": "#",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Precise"
-  },
-  {
-    "Unit": "splash",
-    "Alternative": "",
-    "Alternative__1": "",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Imprecise"
-  },
-  {
-    "Unit": "pinch",
-    "Alternative": "",
-    "Alternative__1": "",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Imprecise"
-  },
-  {
-    "Unit": "pint",
-    "Alternative": "p",
-    "Alternative__1": "pt",
-    "Alternative__2": "fl pt",
-    "Alternative__3": "",
-    "Precision": "Ambiguous"
-  },
-  {
-    "Unit": "quart",
-    "Alternative": "q",
-    "Alternative__1": "qt",
-    "Alternative__2": "fl qt",
-    "Alternative__3": "",
-    "Precision": "Ambiguous"
-  },
-  {
-    "Unit": "gallon",
-    "Alternative": "g",
-    "Alternative__1": "gal",
-    "Alternative__2": "",
-    "Alternative__3": "",
-    "Precision": "Ambiguous"
-  }
-]
diff --git a/grammar.ebnf b/grammar.ebnf
deleted file mode 100644
index 96e749067a5b668b3bd473de61925c4e2663738f..0000000000000000000000000000000000000000
--- a/grammar.ebnf
+++ /dev/null
@@ -1,55 +0,0 @@
-Ambiguator ::= ("<" | ">" | "less than" | "more than")
-
-/* Amount: quantity of an ingredient */
-/* Eg: 10 - 20 g of pasta */
-Amount ::= Ambiguator* Number+ ("-" | "/" | "to")? Number*
-
-/* Number: */
-Number ::= ("0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9")+
-
-/* Unit: unit of measure */
-/* recognises synonyms or shorthand */
-/* Eg: "cup", "grams", "pinch". shorthand: "g", "gr" */
-Unit ::=
-
-/* Ingredient: */
-Ingredient ::= Modifier* Ingredient (Modifier ",")*
-
-/* Modifier: a word or phrase that modifies the ingredient */
-/* Eg: "pears, chopped", "chopped pears", "chicken, skin on" */
-/* Usually ends in "ed" */
-Modifier ::= Verb | Noun Adverb
-
-/* Utensil: an auxiliary object used by the action */
-/* Eg: "bowl", "pan" */
-Utensil ::=
-
-/* Instruction: a verb applied to one or more ingredients */
-/* Does not apply to gerunds like "stirring constantly" */
-/* Eg: "mix the bell pepper with the chicken" */
-Instruction ::= Verb ( Preposition ( Verb )? Preposition? ( Ingredient* | Utensil | Mixture ) ) Preposition+ Utensil
-
-Verb ::=
-
-/* Mixture: a way to refer to multiple previous ingredients */
-/* usually as a result of a previous step in the method */
-/* Eg: "spices", "dry ingredients" */
-Mixture ::=
-
-/* Preposition: word used to link nouns, pronouns, or phrases to other words within a sentence */
-Preposition ::= ("with" | "to" | "in" | "of" | "at" | "for" | "off" | "on" | "over" | "under" | "until")?
-
-/* Article: word used with a noun to specify grammatical definiteness */
-Article ::= ( "a" | "an" | "the")?
-
-/* Conjunction: word used to connect words, phrases, clauses, or sentences */
-Conjunction ::= ("and" | "or" | "but")
-
-/* Adjective: */
-Adjective ::=
-
-/* Adverb: */
-Adverb ::=
-
-/* Punctuation */
-Punctuation ::=
\ No newline at end of file
diff --git a/grammar.lark b/grammar.lark
index 88d46c94eab4b667ea08918ee63544bd727a7136..2cb1479ba37dd95ad7c5f742b07ded4a1ae0e434 100644
--- a/grammar.lark
+++ b/grammar.lark
@@ -4,37 +4,85 @@
 %ignore " "
 %import common.NUMBER
 
-ambiguator: ("<" | ">" | "less than" | "more than")
+ambiguator: AMBIGUATOR
+AMBIGUATOR: ("<" | ">" | "less than" | "more than")
+
+fraction: FRACTION
+FRACTION: NUMBER "/" NUMBER
 
 // amount: quantity of an ingredient
 // eg: 10 - 20 g of pasta
-amount: ambiguator* NUMBER+ ("-" | "/" | "to")? NUMBER*
+// amount: (AMBIGUOUS | [ambiguator*] (NUMBER | fraction) [[unit] ("-" | "/" | "to")? NUMBER*] unit) [PREPOSITION]
+amount: AMBIGUOUS [preposition] | ((NUMBER | fraction) unit ["-" | "/" | "to"])+ [preposition]
+AMBIGUOUS: ("a few drops" | "some" | "a pinch")
 
 // UNIT: unit of measure
 // recognises synonyms or shorthand
 // eg: "cup", "grams", "pinch". shorthand: "g", "gr"
-UNIT: ("gr" | "g")
+unit: (weight | volume | temperature | time | distance | ambiguous | oven)+
+weight: (gram | miligram | kilogram | ounce | pound)
+gram: ("gram" | "grams" | "g" | "gr" | "gramme" | "grammes")
+miligram: ("miligram" | "miligrams" | "mg" | "miligramme" | "miligrammes")
+kilogram: ("kg" | "kilo" | "kilos" | "kiloes" | "kilogramme" | "kilogrammes")
+ounce: ("ounce" | "ounces" | "oz")
+pound: ("pound" | "pounds" | "lb" | "#")
+volume: (tablespoon | teaspoon | cup | pint | quart | gallon | litre | fluidounce)
+tablespoon: ("tablespoon" | "tablespoons" | "tbsp" | "tbsps" | "t" | "tbs" | "tbl")
+teaspoon: ("teaspoon" | "teaspoons" | "tsp")
+fluidounce: ("fluid ounce" | "fluid ounces" | "fl oz")
+pint: ("pint" | "pints" | "p" | "pt" | "pts" | "fl pt" | "fl pts")
+quart: ("quart" | "quarts" | "q" | "qt" | "qts" | "fl qt" | "fl qts")
+gallon: ("gallon" | "gallons" | "g" | "gal" | "gals")
+litre: ("litre" | "litres" | "l")
+mililitre: "(mililitre" | "mililitres" | "mililiter" | "mililiters" | "ml")
+cup: ("cup" | "c" | "cups")
+distance: (milimeter | centimeter | inch | meter)
+milimeter: ("milimeter" | "milimeters" | "milimetre" | "milimetres" | "mm")
+centimeter: ("centimeter" | "centimeters" | "centimetre" | "centimetres" | "cm")
+inch: ("inch" | """ | "in")
+meter: ("meter" | "meters" | "metre" | "metres" | "m")
+temperature: (fahrenheit | celsius)
+fahrenheit: ("fahrenheit" | "fa" | "f" | "fahr")
+celsius: ("celsius" | "cel" | "c")
+time: (seconds: minutes | hours)
+seconds: ("seconds" | "s" | "secs" | "sec" | "second")
+minutes: ("minutes" | "m" | "mins" | "min" | "minute")
+hours: ("hours" | "hour | "h")
+ambiguous: ("slice" | "half" | "entire" | "some" | "few" | "a few" | "several" | "splash" | "pinch" | "drops")
+fan: "fan/gas" NUMBER
 
 // ingredient:
-ingredient: modifier* ingredient (modifier ",")*
+// ingredient: [modifier*] amount unit [preposition] INGREDIENT [conjunction + INGREDIENT] [modifier ","]*
+ingredient: modifier* amount* INGREDIENT [conjunction + INGREDIENT] [aside]
+INGREDIENT: ("almond" | "soy milk" | "cider vinegar" | "vegan butter" | "vegan food colourings" | "sunflower spread" | "caster sugar" | "vanilla extract" | "self-raising flour" | "self raising flour" | "baking powder" | "icing sugar" | "milk" | "vinegar")
+// INGREDIENT: ("acidulated water" | "ackee" | "acorn squash" | "advocaat" | "agar-agar" | "ajwain" | "ale" | "aleppo pepper" | "alfalfa sprouts" | "allspice" | "almond" | "almond essence" | "almond extract" | "almond milk" | "amaranth" | "amaretti" | "amchoor" | "anchovies" | "anchovy essence" | "angelica" | "angostura bitters" | "anise" | "apple" | "apple chutney" | "apple juice" | "apple sauce" | "apricot" | "apricot jam" | "aquafaba" | "arborio rice" | "arbroath smokie" | "argan oil" | "arrowroot" | "artichoke" | "asafoetida" | "asparagus" | "aubergine" | "avocado" | "bacon" | "baguette" | "baked beans" | "baking" | "baking powder" | "balsamic vinegar" | "bamboo shoots" | "banana" | "barbecue sauce" | "barley" | "basil" | "basmati rice" | "bay leaf" | "beans" | "beansprouts" | "b\u00e9chamel sauce" | "beef" | "beef consomm\u00e9" | "beef dripping" | "beef mince" | "beef ribs" | "beef rump" | "beef sausage" | "beef stock" | "beef tomato" | "beer" | "beetroot" | "berry" | "best end of lamb" | "beurre mani\u00e9" | "bicarbonate of soda" | "bird's-eye chillies" | "biscotti" | "biscuits" | "blachan" | "black bean" | "black bean sauce" | "black cardamom" | "black eyed beans" | "black pepper" | "black pudding" | "black sesame seeds" | "blackberry" | "blackcurrant" | "blackcurrant juice drink" | "blini" | "blood orange" | "blueberry" | "boar" | "bok choi" | "bone marrow" | "bonito" | "borage" | "borlotti beans" | "bouquet garni" | "braising steak" | "bramley apple" | "bran" | "brandy" | "brandy butter" | "brandy snaps" | "bratwurst" | "brazil nut" | "bread" | "bread roll" | "bread sauce" | "breadcrumbs" | "breadfruit" | "bresaola" | "brie" | "brill" | "brioche" | "brisket" | "broad beans" | "broccoli" | "brown bread" | "brown lentil" | "brown rice" | "brown sauce" | "brown shrimp" | "brown sugar" | "brussels sprouts" | "buckwheat" | "buckwheat flour" | "bulgur wheat" | "buns" | "burger" | "butter" | "butter beans" | "buttercream icing" | "butterhead lettuce" | "buttermilk" | "butternut squash" | "cabbage" | "caerphilly" | "cake" | "calasparra rice" | "calvados" | "camembert" | "candied peel" | "cannellini beans" | "cape gooseberries" | "capers" | "capsicum" | "caramel" | "caraway seeds" | "cardamom" | "carob" | "carrot" | "cashew" | "cassava" | "cassia bark" | "caster sugar" | "cauliflower" | "caviar" | "cavolo nero" | "cayenne pepper" | "celeriac" | "celery" | "celery seeds" | "chaat masala" | "champ" | "champagne" | "chana dal" | "chanterelle mushrooms" | "chapati flour" | "chapatis" | "charcuterie" | "chard" | "charlotte potato" | "cheddar" | "cheese" | "cherry" | "cherry brandy" | "cherry tomatoes" | "chervil" | "cheshire" | "chestnut" | "chestnut mushrooms" | "chia seeds" | "chicken" | "chicken breast" | "chicken leg" | "chicken liver" | "chicken stock" | "chicken thigh" | "chicken wing" | "chickpea" | "chickpea flour" | "chicory" | "chilli" | "chilli oil" | "chilli paste" | "chilli powder" | "chilli sauce" | "chinese cabbage" | "chinese mushrooms" | "chinese pancake" | "chipotle" | "chips" | "chives" | "chocolate" | "chocolate biscuit" | "chocolate cake" | "chocolate truffle" | "chopped tomatoes" | "chorizo" | "choux pastry" | "christmas pudding" | "chuck and blade" | "chump" | "chutney" | "ciabatta" | "cider" | "cider vinegar" | "cinnamon" | "citrus fruit" | "clams" | "clarified butter" | "clementine" | "clotted cream" | "cloves" | "cobnut" | "cockles" | "cocoa butter" | "cocoa powder" | "coconut" | "coconut cream" | "coconut flour" | "coconut milk" | "coconut oil" | "cod" | "coffee" | "coffee beans" | "coffee essence" | "coffee granules" | "coffee liqueur" | "cognac" | "cola" | "coleslaw" | "coley" | "collar" | "comp\u00f4te" | "comt\u00e9" | "condensed milk" | "coriander" | "coriander cress" | "coriander seeds" | "corn oil" | "corned beef" | "cornflour" | "cos lettuce" | "cottage cheese" | "courgette" | "couscous" | "crab" | "crackers" | "cranberry" | "cranberry juice" | "cranberry sauce" | "crayfish" | "cream" | "cream cheese" | "cream liqueur" | "cream of tartar" | "cream soda" | "creamed coconut" | "cr\u00e8me fra\u00eeche" | "cr\u00eape" | "cress" | "crisps" | "croissant" | "crostini" | "cro\u00fbtons" | "crumble" | "crystallised ginger" | "cucumber" | "cumin" | "curd" | "curd cheese" | "curly kale" | "currants" | "curry" | "curry leaves" | "curry paste" | "curry powder" | "custard" | "custard powder" | "cuttlefish" | "daikon" | "damsons" | "dandelion" | "dark chocolate" | "date" | "demerara sugar" | "desiccated coconut" | "desir\u00e9e potato" | "digestive biscuit" | "dijon mustard" | "dill" | "dim sum wrappers" | "dolcelatte" | "double cream" | "double gloucester" | "dragon fruit" | "dried apricots" | "dried cherries" | "dried chilli" | "dried fruit" | "dried mixed fruit" | "dry sherry" | "duck" | "duck confit" | "duck fat" | "dulce de leche" | "dumplings" | "eel" | "egg" | "egg wash" | "egg white" | "egg yolk" | "elderflower" | "emmental" | "english muffin" | "english mustard" | "evaporated milk" | "exotic fruit" | "falafel" | "farfalle" | "fat" | "fennel" | "fennel seeds" | "fenugreek" | "feta" | "fettuccine" | "field mushroom" | "fig" | "fillet of beef" | "filo pastry" | "fish" | "fish paste" | "fish roe" | "fish sauce" | "fish soup" | "five-spice powder" | "flageolet beans" | "flaked almonds" | "flank" | "flatbread" | "flatfish" | "flaxseed" | "fleur de sel" | "flour" | "flour tortilla" | "floury potato" | "focaccia" | "fondant icing" | "fontina cheese" | "food colouring" | "forced rhubarb" | "fortified wine" | "freekeh" | "french beans" | "french bread" | "french dressing" | "fresh coriander" | "fresh tuna" | "fromage frais" | "fruit" | "fruit brandy" | "fruit cake" | "fruit juice" | "fudge" | "fusilli" | "galangal" | "game" | "gammon" | "garam masala" | "garlic" | "garlic and herb cream cheese" | "garlic bread" | "gelatine" | "ghee" | "gherkin" | "giblets" | "gin" | "ginger" | "ginger ale" | "ginger beer" | "ginger biscuit" | "gingerbread" | "glac\u00e9 cherries" | "globe artichoke" | "glucose" | "gluten-free flour" | "gnocchi" | "goat" | "goats' cheese" | "goji berries" | "golden syrup" | "goose" | "goose fat" | "gooseberry" | "gorgonzola" | "gouda" | "grains" | "gram flour" | "grapefruit" | "grapefruit juice" | "grapes" | "grapeseed oil" | "gratin" | "gravy" | "gravy browning" | "green banana" | "green beans" | "green cabbage" | "green lentil" | "green tea" | "greengages" | "ground almonds" | "ground ginger" | "grouse" | "gruy\u00e8re" | "guacamole" | "guava" | "gurnard" | "haddock" | "haggis" | "hake" | "halibut" | "halloumi" | "ham" | "hare" | "haricot beans" | "harissa" | "hazelnut" | "hazelnut oil" | "heart" | "herbal tea" | "herbes de provence" | "herbs" | "herring" | "hogget" | "hoisin sauce" | "hollandaise sauce" | "honey" | "honeycomb" | "horseradish" | "horseradish sauce" | "hot cross buns" | "hummus" | "hunza apricots" | "ice cream" | "iceberg lettuce" | "icing" | "icing sugar" | "irish stout" | "jackfruit" | "jaggery" | "jam" | "jasmine rice" | "jelly" | "jerk seasoning" | "jersey royal potatoes" | "jerusalem artichoke" | "juniper berries" | "jus" | "kale" | "ketchup" | "ketjap manis" | "kidney" | "kidney beans" | "king edward" | "kipper" | "kirsch" | "kiwi fruit" | "kohlrabi" | "lager" | "lamb" | "lamb breast" | "lamb chop" | "lamb fillet" | "lamb kidney" | "lamb loin" | "lamb mince" | "lamb neck" | "lamb rump" | "lamb shank" | "lamb shoulder" | "lamb stock" | "lancashire cheese" | "langoustine" | "lard" | "lardons" | "lasagne" | "lasagne sheets" | "laverbread" | "leek" | "leftover turkey" | "leg of lamb" | "lemon" | "lemon balm" | "lemon curd" | "lemon juice" | "lemon sole" | "lemonade" | "lemongrass" | "lentils" | "lettuce" | "lime" | "lime cordial" | "lime juice" | "lime leaves" | "lime pickle" | "ling" | "lingonberry" | "linguine" | "liqueur" | "liquorice" | "little gem lettuce" | "liver" | "loaf cake" | "lobster" | "long-grain rice" | "lovage" | "low-calorie sweetener" | "lychee" | "macadamia" | "macaroni" | "macaroon" | "mace" | "mackerel" | "madeira" | "madeira cake" | "madeleines" | "maize" | "manchego" | "mandarin" | "mangetout" | "mango" | "mango chutney" | "mango juice" | "maple syrup" | "margarine" | "marjoram" | "marmalade" | "marrow" | "marrowfat peas" | "marsala wine" | "marshmallow" | "marzipan" | "mascarpone" | "mashed potato" | "matzo" | "mayonnaise" | "meat" | "medlars" | "melon" | "meringue" | "milk" | "milk chocolate" | "mince" | "mince pies" | "mincemeat" | "mint" | "mint sauce" | "mirin" | "miso" | "mixed berries" | "mixed nuts" | "mixed spice" | "mixed spices" | "molasses" | "monkfish" | "morel" | "mortadella" | "mozzarella" | "muesli" | "muffins" | "mung beans" | "mung dal" | "mushroom" | "mussels" | "mustard" | "mustard cress" | "mustard powder" | "mustard seeds" | "mutton" | "naan bread" | "nachos" | "nasturtium" | "nectarine" | "nettle" | "new potatoes" | "nibbed almonds" | "nigella seeds" | "noodles" | "nori" | "nougat" | "nut" | "nutmeg" | "oatcakes" | "oatmeal" | "oats" | "octopus" | "offal" | "oil" | "oily fish" | "okra" | "olive" | "olive oil" | "onion" | "orange" | "orange juice" | "orange liqueur" | "oregano" | "ouzo" | "oxtail" | "oyster" | "oyster mushrooms" | "oyster sauce" | "paella" | "pak choi" | "palm oil" | "palm sugar" | "pancakes" | "pancetta" | "panch phoran" | "pandan leaves" | "paneer" | "panettone" | "papaya" | "pappardelle" | "paprika" | "paratha" | "parma ham" | "parmesan" | "parsley" | "parsnip" | "partridge" | "passata" | "passion fruit" | "passion fruit juice" | "pasta" | "pasta sauce" | "pastrami" | "pastry" | "pasty" | "p\u00e2t\u00e9" | "pea shoots" | "peach" | "peanut butter" | "peanut oil" | "peanuts" | "pear" | "pearl barley" | "peas" | "pecan" | "pecorino" | "pectin" | "peel" | "penne" | "pepper" | "peppercorn" | "pepperoni" | "perry" | "pesto" | "pheasant" | "piccalilli" | "pickle" | "pickled onion" | "pie" | "pigeon" | "pigeon peas" | "pine nut" | "pineapple" | "pineapple juice" | "pink fir apple" | "pink peppercorn" | "pinto beans" | "pistachio" | "pitta bread" | "plaice" | "plain flour" | "plantain" | "plum" | "polenta" | "pollack" | "pollock" | "pomegranate" | "pomegranate juice" | "pomegranate molasses" | "pomelo" | "popcorn" | "poppy seeds" | "porcini" | "pork" | "pork belly" | "pork chop" | "pork fillet" | "pork leg" | "pork loin" | "pork mince" | "pork sausages" | "pork shoulder" | "pork spare rib" | "porridge" | "port" | "portobello mushrooms" | "potato" | "potato wedges" | "poultry" | "poussin" | "prawn" | "prawn crackers" | "preserved lemons" | "preserves" | "pretzels" | "prosciutto" | "prune" | "pudding rice" | "puff pastry" | "pulled pork" | "pumpernickel bread" | "pumpkin" | "pumpkin seed" | "purple sprouting broccoli" | "puy lentils" | "quail" | "quails' egg" | "quark" | "quince" | "quinoa" | "quorn" | "rabbit" | "rack of lamb" | "radicchio" | "radish" | "rainbow chard" | "rainbow trout" | "raisins" | "raita" | "rapeseed oil" | "ras-el-hanout" | "raspberry" | "raspberry jam" | "ratafia biscuits" | "ratatouille" | "red cabbage" | "red leicester" | "red lentil" | "red mullet" | "red onion" | "red rice" | "red snapper" | "red wine" | "red wine vinegar" | "redcurrant" | "redcurrant jelly" | "rennet" | "rhubarb" | "rib of beef" | "rice" | "rice flour" | "rice noodles" | "rice vinegar" | "rice wine" | "ricotta" | "rigatoni" | "risotto rice" | "roast beef" | "roast chicken" | "roast lamb" | "roast pork" | "roast potatoes" | "roasted vegetables" | "rock salt" | "rocket" | "root vegetable" | "roquefort" | "rosemary" | "rosewater" | "royal icing" | "rum" | "rump" | "runner beans" | "rye bread" | "rye flour" | "saffron" | "sage" | "sage derby" | "salad" | "salad leaves" | "salami" | "salmon" | "salsa" | "salsify" | "salt" | "salt beef" | "salt cod" | "samphire" | "sardine" | "satay" | "satsuma" | "sauces" | "saucisson" | "sauerkraut" | "sausage" | "savory" | "savoy cabbage" | "scallop" | "scotch bonnet chilli" | "scrag" | "sea bass" | "sea bream" | "sea salt" | "seafood" | "seasoning" | "seaweed" | "seeds" | "self-raising flour" | "semolina" | "serrano ham" | "sesame oil" | "sesame seeds" | "seville orange" | "shallot" | "sharon fruit" | "shellfish" | "sherry" | "sherry vinegar" | "shiitake mushroom" | "shin" | "shortbread" | "shortcrust pastry" | "sichuan pepper" | "silverside" | "single cream" | "sirloin" | "skate" | "sloe" | "sloe gin" | "smoked cheese" | "smoked fish" | "smoked haddock" | "smoked mackerel" | "smoked paprika" | "smoked salmon" | "smoked trout" | "soba noodles" | "soda bread" | "soda water" | "sorrel" | "soup" | "sourdough bread" | "soured cream" | "soy sauce" | "soy milk" | "soya beans" | "soya flour" | "soya milk" | "spaghetti" | "sparkling wine" | "spelt" | "spelt flour" | "spices" | "spinach" | "split peas" | "sponge cake" | "spring greens" | "spring onion" | "spring roll wrappers" | "squash" | "squid" | "sriracha" | "star anise" | "steak" | "stem ginger" | "stewing lamb" | "stilton" | "stock" | "strawberry" | "strawberry jam" | "strong white flour" | "stuffing" | "suet" | "sugar" | "sugar-snap peas" | "sultanas" | "sumac" | "summer fruit" | "sunflower oil" | "sunflower seed" | "sushi rice" | "swede" | "sweet potato" | "sweet sherry" | "sweetbread" | "sweetcorn" | "sweets" | "swiss chard" | "swiss rolls and roulades" | "swordfish" | "syrup" | "t-bone steak" | "tabasco" | "taco" | "tagliatelle" | "tahini" | "taleggio" | "tamari" | "tamarind" | "tangerine" | "tapenade" | "tapioca" | "tarragon" | "tayberry" | "tea" | "tequila" | "teriyaki sauce" | "thai basil" | "thyme" | "tilapia" | "tinned tuna" | "toffee" | "tofu" | "tomatillo" | "tomato" | "tomato chutney" | "tomato juice" | "tomato pur\u00e9e" | "tongue" | "tonic" | "topside" | "treacle" | "trout" | "truffle" | "truffle oil" | "turbot" | "turkey" | "turkey breast" | "turkey mince" | "turkish delight" | "turmeric" | "turnip" | "urid dal" | "vacherin" | "vanilla bean paste" | "vanilla essence" | "vanilla extract" | "vanilla pod" | "veal" | "vegetable oil" | "vegetable shortening" | "vegetable stock" | "vegetables" | "vegetarian sausage" | "venison" | "vermicelli (pasta)" | "vermouth" | "vine leaves" | "vinegar" | "vodka" | "walnut" | "walnut oil" | "wasabi" | "water chestnut" | "watercress" | "watermelon" | "waxy potato" | "wensleydale" | "wheatgerm" | "whelk" | "whipping cream" | "whisky" | "whisky liqueur" | "white bread" | "white cabbage" | "white chocolate" | "white fish" | "white pepper" | "white wine" | "white wine vinegar" | "whitecurrant" | "whiting" | "whole wheat pasta" | "wholegrain mustard" | "wholemeal bread" | "wholemeal flour" | "wild garlic" | "wild mushrooms" | "wild rice" | "wine" | "wood pigeon" | "worcestershire sauce" | "wraps" | "yam" | "yeast" | "yeast extract" | "yoghurt" | "yuzu" | "zest")
+
+// aside: Match and ignore anything inside brackets
+// consider using %ignore aside
+aside: ASIDE
+ASIDE: /\(.*\)/
 
 // modifier: a word or phrase that modifies the ingredient
 // eg: "pears, chopped", "chopped pears", "chicken, skin on"
 // usually ends in "ed"
-modifier: verb | ingredient adverb
+modifier: verb | INGREDIENT adverb
 
-adverb:
+// noun
+noun: NOUN | utensil | ingredient
+NOUN: ("holes")
 
 // UTENSIL: an auxiliary object used by the action
 // eg: "bowl", "pan"
-UTENSIL: ("bowl" | "pan")
+utensil: UTENSIL
+UTENSIL: ("bowl" | "pan" | "oven" | "12-hole cupcake tin" | "paper cases" | "jug")
 
 // instruction: a verb applied to one or more ingredients
 // does not apply to gerunds like "stirring constantly"
 // eg: "mix the bell pepper with the chicken"
 instruction: verb ( PREPOSITION ( verb )? PREPOSITION? ( ingredient* | UTENSIL | mixture ) ) PREPOSITION+ UTENSIL
 
-verb:
+verb: VERB
+VERB: ("add" | "incorporate" | "cut" | "chop" | "fry" | "sear" | "brown" | "cook" | "brown" | "cook" | "simmer" | "quenelle" | "avoid" | "bake" | "roast" | "heat" | "preheat" | "beat" | "divide" | "portion" | "split" | "fill" | "cool" | "spoon" | "pipe" | "line" | "fold" | "whisk" | "stir" | "peel")
 
 // mixture: a way to refer to multiple previous ingredients
 // usually as a result of a previous step in the method
@@ -42,22 +90,29 @@ verb:
 mixture:
 
 // PREPOSITION: word used to link nouns, pronouns, or phrases to other words within a sentence
+preposition: PREPOSITION
 PREPOSITION: ("with" | "to" | "in" | "of" | "at" | "for" | "off" | "on" | "over" | "under" | "until")
 
 // ARTICLE: word used with a noun to specify grammatical definiteness
+article: ARTICLE
 ARTICLE: ("a" | "an" | "the")
 
 // CONJUNCTION: word used to connect words, phrases, clauses, or sentences
+conjunction: CONJUNCTION
 CONJUNCTION: ("and" | "or" | "but")
 
 // ADJECTIVE:
+adjective: ADJECTIVE
 ADJECTIVE: ("red" | "fast")
 
 // ADVERB:
+adverb: ADVERB
 ADVERB: ("quickly")
 
-// PUNCTUATION
-// Ignore punctuation
+punctuation: PUNCTUATION
 PUNCTUATION: "."
 
-!start: ADVERB PUNCTUATION+ CONJUNCTION
+steps: (sentence punctuation)+
+sentence: verb article noun ((preposition | conjunction) [article] noun)+
+
+!start: (ingredient | steps)
diff --git a/lark_parser.py b/lark_parser.py
deleted file mode 100644
index cf60ada00e3d6d29aa51d41d26382bed2fa2e50c..0000000000000000000000000000000000000000
--- a/lark_parser.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from lark import Lark, tree
-
-parser = Lark(open('grammar.lark', 'r'), start='start')
-
-input = "quickly . and"
-
-print(parser.parse(input).pretty())
-
-# print to png file
-tree.pydot__tree_to_png(parser.parse(input), 'ast.png')
diff --git a/lexer.py b/lexer.py
deleted file mode 100644
index 883d8ea4dca8891f2a8560ab565c755eafea1eba..0000000000000000000000000000000000000000
--- a/lexer.py
+++ /dev/null
@@ -1,32 +0,0 @@
-import json
-
-# Lexer
-# Converts the input stream into a series of tokens separated by whitespace
-# Returns a JSON map classifying each token
-def lex(tokenStream):
-    tokens = {}
-
-    types = ['Ingredient',
-            'Unit',
-            'Utensil',
-            'Preposition',
-            'Article',
-            'Conjunction',
-            'Adjective',
-            'Number',
-            'Amount']
-
-    # open each json file as a string
-    # need to read each file as an array not a string
-    jsonFiles = {tokenType: open('database/{}.json'.format(tokenType), 'r') for tokenType in types}
-    with open('database/Number.json', 'r') as f:
-        jsonFile = f.read()
-
-    for currentToken in tokenStream.split():
-        if currentToken in jsonFiles.items():
-            tokens[currentToken] = jsonFile
-        else:
-            tokens[currentToken] = "Unknown"
-    return tokens
-
-print(lex("Slice 3 g of Potato and then cut into strips"))
diff --git a/parser.py b/parser.py
old mode 100644
new mode 100755
index 70235f4cc79f9c9757c444fb487a7c4d597ebebf..d07bbf8e96dadd303f3be7e965f6edaeb7a99929
--- a/parser.py
+++ b/parser.py
@@ -1,48 +1,26 @@
-from graphviz import Digraph
-# Parser: parses the stream of tokens generated by the lexer and creates an abstract syntax tree
-
-# Each token will become a node in the graph
-# Nodes are represented with the Node type, each instance of which contains a "children" array which holds more Nodes
-class Node:
-    def __init__(self, name):
-        self.name = name
-        self.children = []
-        
-    def add(self, node):
-        self.children.append(node)
-
-# Ingredient ::=
-def ingredient():
-    node = Node('ingredient')
-
-# Amount ::= Digit+ ("-" | "/" | "to")? Digit*
-def amount():
-    node = Node('digit')
-    if nextToken().type == 'digit':
-        return node
-
-# Digit ::= ("0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9")+
-def digit():
-    node = Node('digit')
-
-def unit():
-    node = Node('unit')
-
-def example():
-    text = "10 to 20 minutes"
-    dot = Digraph(comment='Abstract Syntax Tree')
-    dot.node('a', 'amount')
-    dot.node('d', 'digit')
-    dot.edge('a', 'd')
-    dot.node('t', '10')
-    dot.edge('d', 't')
-    dot.node('to')
-    dot.node('digit')
-    dot.node('unit')
-    dot.render('ast.gv', view=True)
-
-def draw():
-    dot = Digraph(comment='Abstract Syntax Tree')
-    dot.render('ast.gv', view=True)
-
-example()
+from lark import Lark, tree
+from anytree.exporter import JsonExporter
+from anytree.importer import DictImporter
+import json
+
+importer = DictImporter()
+exporter = JsonExporter(indent=2, sort_keys=True)
+
+with open('grammar.lark', 'r') as grammar:
+    parser = Lark(grammar, start='start')
+
+# Parse
+# filename = 'recipes/easy.json'
+filename = 'recipes/vegancupcakes.json'
+with open(filename, 'r') as recipe:
+    for section in ['Ingredients']:
+        for i in json.load(recipe)[section]:
+            print(parser.parse(i).pretty())
+#           print(parser.parse(i).__dict__)
+#           exporter.export(parser.parse(i).__dict__)
+            # Print JSON AST - dict object has no __dict__
+#           root = importer.import_(parser.parse(i).__dict__)
+#           print(exporter.export(root))
+            # Doesn't work - object Tree not serializable
+            # print(json.dumps(parser.parse(i).__dict__))
+            tree.pydot__tree_to_png(parser.parse(i), 'ast.png')
diff --git a/preprocessor.py b/preprocessor.py
old mode 100644
new mode 100755
diff --git a/recipes/.Recipe.schema.json.un~ b/recipes/.Recipe.schema.json.un~
new file mode 100755
index 0000000000000000000000000000000000000000..b86522ef4efa13b5d5be433844e0a9e29e5a2686
Binary files /dev/null and b/recipes/.Recipe.schema.json.un~ differ
diff --git a/recipes/Recipe.schema.json b/recipes/Recipe.schema.json
new file mode 100755
index 0000000000000000000000000000000000000000..441a2fe9adcc3d3a6537d7c53c05c379084e58ed
--- /dev/null
+++ b/recipes/Recipe.schema.json
@@ -0,0 +1,125 @@
+{
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "type": "object",
+    "properties": {
+        "Name": {
+            "type": "string"
+        },
+        "Ingredients": {
+            "type": "array",
+            "items": [
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                }
+            ]
+        },
+        "Steps": {
+            "type": "array",
+            "items": [
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                },
+                {
+                    "type": "string"
+                }
+            ]
+        },
+        "Yield": {
+            "type": "string"
+        },
+        "Difficulty": {
+            "type": "string"
+        },
+        "Preparation": {
+            "type": "string"
+        },
+        "Cook": {
+            "type": "string"
+        },
+        "Nutrition": {
+            "type": "object",
+            "properties": {
+                "Kcal": {
+                    "type": "string"
+                },
+                "Fat": {
+                    "type": "string"
+                },
+                "Saturates": {
+                    "type": "string"
+                },
+                "Carbs": {
+                    "type": "string"
+                },
+                "Sugars": {
+                    "type": "string"
+                },
+                "Fibre": {
+                    "type": "string"
+                },
+                "Protein": {
+                    "type": "string"
+                },
+                "Salt": {
+                    "type": "string"
+                }
+            },
+            "required": [
+                "Kcal",
+                "Fat",
+                "Saturates",
+                "Carbs",
+                "Sugars",
+                "Fibre",
+                "Protein",
+                "Salt"
+            ]
+        }
+    },
+    "required": [
+        "Name",
+        "Ingredients",
+        "Steps",
+        "Yield",
+        "Difficulty",
+        "Preparation",
+        "Cook",
+        "Nutrition"
+    ]
+}
diff --git a/recipes/easy.json b/recipes/easy.json
new file mode 100755
index 0000000000000000000000000000000000000000..1d473f79cefa0512c6ad8739c0c607f500e75921
--- /dev/null
+++ b/recipes/easy.json
@@ -0,0 +1 @@
+"heat the oven to 320 celsius."
diff --git a/recipes/vegancupcakes.json b/recipes/vegancupcakes.json
new file mode 100755
index 0000000000000000000000000000000000000000..20e26a49d678cc4ef35d65ed29ccafea858622c7
--- /dev/null
+++ b/recipes/vegancupcakes.json
@@ -0,0 +1,36 @@
+{
+    "Cook": "20 mins",
+    "Difficulty": "Easy",
+    "Ingredients": [
+        "150 ml almond or soy milk",
+        "1/2 tsp cider vinegar",
+        "110 g vegan butter or sunflower spread",
+        "110 g caster sugar",
+        "1 tsp vanilla extract",
+        "110 g self-raising flour",
+        "1/2 tsp baking powder",
+        "125 g vegan butter",
+        "250 g icing sugar",
+        "1/4 tsp vanilla extract",
+        "a few drops of vegan food colourings (check the label)"
+    ],
+    "Name": "Vegan cupcakes",
+    "Nutrition": {
+        "Carbs": "",
+        "Fat": "12g",
+        "Fibre": "0.4g",
+        "Kcal": "265",
+        "Protein": "1g",
+        "Salt": "0.28g",
+        "Saturates": "3g",
+        "Sugars": "30g"
+    },
+    "Preparation": "30 mins",
+    "Steps": [
+        "Heat the oven to 180C/160C fan/gas 4. Line the holes of a 12-hole cupcake tin with paper cases. Stir the milk and vinegar in a jug and leave to thicken slightly for a few mins.",
+        "Beat the butter and sugar with an electric whisk until well combined. Whisk in the vanilla, then add the milk a splash at a time, alternating with spoonfuls of the flour. Fold in any remaining flour, the baking powder and a pinch of salt until you get a creamy batter. Don\u2019t worry if it looks a little curdled at this stage.",
+        "Divide between the cupcake cases, filling them two-thirds\u00a0full, and bake for 20 - 25 mins until\u00a0golden and risen. Leave to cool on a wire rack.",
+        "To make the buttercream, beat the butter, icing sugar and vanilla with an electric whisk until pale and creamy. Divide between bowls and colour with different food colourings until you get desired strength. Spoon or pipe onto the cooled cupcakes."
+    ],
+    "Yield": "Makes 12"
+}
diff --git a/scrape_utensils.py b/scrape_utensils.py
new file mode 100755
index 0000000000000000000000000000000000000000..155f064b6749f6e65fe5463b4f70e73e7c74464f
--- /dev/null
+++ b/scrape_utensils.py
@@ -0,0 +1,8 @@
+import urllib.request
+import requests
+from bs4 import BeautifulSoup
+
+url = "https://en.wikipedia.org/wiki/List_of_food_preparation_utensils"
+soup = BeautifulSoup(requests.get(url).text, 'html.parser')
+for i in soup.select("th[scope=row] > a"): # > th > a"):
+    print(i.text)
diff --git a/scraper.py b/scraper.py
old mode 100644
new mode 100755
index 9c754b48ade218dd3ae4f05236e45401a13a1261..393c6ed94562730fefd187fc588290c9d6ce9baf
--- a/scraper.py
+++ b/scraper.py
@@ -1,5 +1,4 @@
 from recipe_scrapers import scrape_me
-from usp.tree import sitemap_tree_for_homepage
 import urllib.request
 import requests
 from bs4 import BeautifulSoup
@@ -65,10 +64,12 @@ def scrapeIngredients():
             "https://www.bbc.co.uk/food/ingredients/a-z/z/1"
             ]
 
-def urlList(sitemap):
+def urlList(url):
     # get sitemap with https://stackoverflow.com/questions/10232774/how-to-find-sitemap-xml-path-on-websites
-    soup = BeautifulSoup(requests.get(sitemap), 'xml')
-    urls = [url for url in soup.find_all("loc", text=True) if url.contains("recipe")]
+    soup = BeautifulSoup(requests.get(url).text, 'html.parser')
+    urls = soup.find_all("a")
+    matchingURLs = [url.get("href") for url in urls if "recipes" in url.get("href")]
+    return matchingURLs
 
 websites = [
         "http://101cookbooks.com/",
@@ -121,7 +122,11 @@ websites = [
         "http://yummly.com/"
         ]
 
-urlList("https://bbc.co.uk/food/sitemap.xml")
+
+
+urlList("https://bbc.co.uk/food/ingredients")
+scrapeIngredients()
+scrapeUtensils()
 
 for website in websites:
     for url in urlList(website):
diff --git a/still-good-food b/still-good-food
new file mode 160000
index 0000000000000000000000000000000000000000..a05b69367897fb55f7deafafe8feea651be10fb1
--- /dev/null
+++ b/still-good-food
@@ -0,0 +1 @@
+Subproject commit a05b69367897fb55f7deafafe8feea651be10fb1
diff --git a/database/.gitkeep b/terminals/Adjective.lark
old mode 100644
new mode 100755
similarity index 100%
rename from database/.gitkeep
rename to terminals/Adjective.lark
diff --git a/database/recipes/.gitkeep b/terminals/Article.lark
old mode 100644
new mode 100755
similarity index 100%
rename from database/recipes/.gitkeep
rename to terminals/Article.lark
diff --git a/terminals/Conjunction.lark b/terminals/Conjunction.lark
new file mode 100755
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/terminals/Ingredients.lark b/terminals/Ingredients.lark
new file mode 100755
index 0000000000000000000000000000000000000000..38ce3f88972c7c10025404e55ee2b4debe3b3cb1
--- /dev/null
+++ b/terminals/Ingredients.lark
@@ -0,0 +1 @@
+INGREDIENT = ("acidulated water" | "ackee" | "acorn squash" | "advocaat" | "agar-agar" | "ajwain" | "ale" | "aleppo pepper" | "alfalfa sprouts" | "allspice" | "almond" | "almond essence" | "almond extract" | "almond milk" | "amaranth" | "amaretti" | "amchoor" | "anchovies" | "anchovy essence" | "angelica" | "angostura bitters" | "anise" | "apple" | "apple chutney" | "apple juice" | "apple sauce" | "apricot" | "apricot jam" | "aquafaba" | "arborio rice" | "arbroath smokie" | "argan oil" | "arrowroot" | "artichoke" | "asafoetida" | "asparagus" | "aubergine" | "avocado" | "bacon" | "baguette" | "baked beans" | "baking" | "baking powder" | "balsamic vinegar" | "bamboo shoots" | "banana" | "barbecue sauce" | "barley" | "basil" | "basmati rice" | "bay leaf" | "beans" | "beansprouts" | "b\u00e9chamel sauce" | "beef" | "beef consomm\u00e9" | "beef dripping" | "beef mince" | "beef ribs" | "beef rump" | "beef sausage" | "beef stock" | "beef tomato" | "beer" | "beetroot" | "berry" | "best end of lamb" | "beurre mani\u00e9" | "bicarbonate of soda" | "bird's-eye chillies" | "biscotti" | "biscuits" | "blachan" | "black bean" | "black bean sauce" | "black cardamom" | "black eyed beans" | "black pepper" | "black pudding" | "black sesame seeds" | "blackberry" | "blackcurrant" | "blackcurrant juice drink" | "blini" | "blood orange" | "blueberry" | "boar" | "bok choi" | "bone marrow" | "bonito" | "borage" | "borlotti beans" | "bouquet garni" | "braising steak" | "bramley apple" | "bran" | "brandy" | "brandy butter" | "brandy snaps" | "bratwurst" | "brazil nut" | "bread" | "bread roll" | "bread sauce" | "breadcrumbs" | "breadfruit" | "bresaola" | "brie" | "brill" | "brioche" | "brisket" | "broad beans" | "broccoli" | "brown bread" | "brown lentil" | "brown rice" | "brown sauce" | "brown shrimp" | "brown sugar" | "brussels sprouts" | "buckwheat" | "buckwheat flour" | "bulgur wheat" | "buns" | "burger" | "butter" | "butter beans" | "buttercream icing" | "butterhead lettuce" | "buttermilk" | "butternut squash" | "cabbage" | "caerphilly" | "cake" | "calasparra rice" | "calvados" | "camembert" | "candied peel" | "cannellini beans" | "cape gooseberries" | "capers" | "capsicum" | "caramel" | "caraway seeds" | "cardamom" | "carob" | "carrot" | "cashew" | "cassava" | "cassia bark" | "caster sugar" | "cauliflower" | "caviar" | "cavolo nero" | "cayenne pepper" | "celeriac" | "celery" | "celery seeds" | "chaat masala" | "champ" | "champagne" | "chana dal" | "chanterelle mushrooms" | "chapati flour" | "chapatis" | "charcuterie" | "chard" | "charlotte potato" | "cheddar" | "cheese" | "cherry" | "cherry brandy" | "cherry tomatoes" | "chervil" | "cheshire" | "chestnut" | "chestnut mushrooms" | "chia seeds" | "chicken" | "chicken breast" | "chicken leg" | "chicken liver" | "chicken stock" | "chicken thigh" | "chicken wing" | "chickpea" | "chickpea flour" | "chicory" | "chilli" | "chilli oil" | "chilli paste" | "chilli powder" | "chilli sauce" | "chinese cabbage" | "chinese mushrooms" | "chinese pancake" | "chipotle" | "chips" | "chives" | "chocolate" | "chocolate biscuit" | "chocolate cake" | "chocolate truffle" | "chopped tomatoes" | "chorizo" | "choux pastry" | "christmas pudding" | "chuck and blade" | "chump" | "chutney" | "ciabatta" | "cider" | "cinnamon" | "citrus fruit" | "clams" | "clarified butter" | "clementine" | "clotted cream" | "cloves" | "cobnut" | "cockles" | "cocoa butter" | "cocoa powder" | "coconut" | "coconut cream" | "coconut flour" | "coconut milk" | "coconut oil" | "cod" | "coffee" | "coffee beans" | "coffee essence" | "coffee granules" | "coffee liqueur" | "cognac" | "cola" | "coleslaw" | "coley" | "collar" | "comp\u00f4te" | "comt\u00e9" | "condensed milk" | "coriander" | "coriander cress" | "coriander seeds" | "corn oil" | "corned beef" | "cornflour" | "cos lettuce" | "cottage cheese" | "courgette" | "couscous" | "crab" | "crackers" | "cranberry" | "cranberry juice" | "cranberry sauce" | "crayfish" | "cream" | "cream cheese" | "cream liqueur" | "cream of tartar" | "cream soda" | "creamed coconut" | "cr\u00e8me fra\u00eeche" | "cr\u00eape" | "cress" | "crisps" | "croissant" | "crostini" | "cro\u00fbtons" | "crumble" | "crystallised ginger" | "cucumber" | "cumin" | "curd" | "curd cheese" | "curly kale" | "currants" | "curry" | "curry leaves" | "curry paste" | "curry powder" | "custard" | "custard powder" | "cuttlefish" | "daikon" | "damsons" | "dandelion" | "dark chocolate" | "date" | "demerara sugar" | "desiccated coconut" | "desir\u00e9e potato" | "digestive biscuit" | "dijon mustard" | "dill" | "dim sum wrappers" | "dolcelatte" | "double cream" | "double gloucester" | "dragon fruit" | "dried apricots" | "dried cherries" | "dried chilli" | "dried fruit" | "dried mixed fruit" | "dry sherry" | "duck" | "duck confit" | "duck fat" | "dulce de leche" | "dumplings" | "eel" | "egg" | "egg wash" | "egg white" | "egg yolk" | "elderflower" | "emmental" | "english muffin" | "english mustard" | "evaporated milk" | "exotic fruit" | "falafel" | "farfalle" | "fat" | "fennel" | "fennel seeds" | "fenugreek" | "feta" | "fettuccine" | "field mushroom" | "fig" | "fillet of beef" | "filo pastry" | "fish" | "fish paste" | "fish roe" | "fish sauce" | "fish soup" | "five-spice powder" | "flageolet beans" | "flaked almonds" | "flank" | "flatbread" | "flatfish" | "flaxseed" | "fleur de sel" | "flour" | "flour tortilla" | "floury potato" | "focaccia" | "fondant icing" | "fontina cheese" | "food colouring" | "forced rhubarb" | "fortified wine" | "freekeh" | "french beans" | "french bread" | "french dressing" | "fresh coriander" | "fresh tuna" | "fromage frais" | "fruit" | "fruit brandy" | "fruit cake" | "fruit juice" | "fudge" | "fusilli" | "galangal" | "game" | "gammon" | "garam masala" | "garlic" | "garlic and herb cream cheese" | "garlic bread" | "gelatine" | "ghee" | "gherkin" | "giblets" | "gin" | "ginger" | "ginger ale" | "ginger beer" | "ginger biscuit" | "gingerbread" | "glac\u00e9 cherries" | "globe artichoke" | "glucose" | "gluten-free flour" | "gnocchi" | "goat" | "goats' cheese" | "goji berries" | "golden syrup" | "goose" | "goose fat" | "gooseberry" | "gorgonzola" | "gouda" | "grains" | "gram flour" | "grapefruit" | "grapefruit juice" | "grapes" | "grapeseed oil" | "gratin" | "gravy" | "gravy browning" | "green banana" | "green beans" | "green cabbage" | "green lentil" | "green tea" | "greengages" | "ground almonds" | "ground ginger" | "grouse" | "gruy\u00e8re" | "guacamole" | "guava" | "gurnard" | "haddock" | "haggis" | "hake" | "halibut" | "halloumi" | "ham" | "hare" | "haricot beans" | "harissa" | "hazelnut" | "hazelnut oil" | "heart" | "herbal tea" | "herbes de provence" | "herbs" | "herring" | "hogget" | "hoisin sauce" | "hollandaise sauce" | "honey" | "honeycomb" | "horseradish" | "horseradish sauce" | "hot cross buns" | "hummus" | "hunza apricots" | "ice cream" | "iceberg lettuce" | "icing" | "icing sugar" | "irish stout" | "jackfruit" | "jaggery" | "jam" | "jasmine rice" | "jelly" | "jerk seasoning" | "jersey royal potatoes" | "jerusalem artichoke" | "juniper berries" | "jus" | "kale" | "ketchup" | "ketjap manis" | "kidney" | "kidney beans" | "king edward" | "kipper" | "kirsch" | "kiwi fruit" | "kohlrabi" | "lager" | "lamb" | "lamb breast" | "lamb chop" | "lamb fillet" | "lamb kidney" | "lamb loin" | "lamb mince" | "lamb neck" | "lamb rump" | "lamb shank" | "lamb shoulder" | "lamb stock" | "lancashire cheese" | "langoustine" | "lard" | "lardons" | "lasagne" | "lasagne sheets" | "laverbread" | "leek" | "leftover turkey" | "leg of lamb" | "lemon" | "lemon balm" | "lemon curd" | "lemon juice" | "lemon sole" | "lemonade" | "lemongrass" | "lentils" | "lettuce" | "lime" | "lime cordial" | "lime juice" | "lime leaves" | "lime pickle" | "ling" | "lingonberry" | "linguine" | "liqueur" | "liquorice" | "little gem lettuce" | "liver" | "loaf cake" | "lobster" | "long-grain rice" | "lovage" | "low-calorie sweetener" | "lychee" | "macadamia" | "macaroni" | "macaroon" | "mace" | "mackerel" | "madeira" | "madeira cake" | "madeleines" | "maize" | "manchego" | "mandarin" | "mangetout" | "mango" | "mango chutney" | "mango juice" | "maple syrup" | "margarine" | "marjoram" | "marmalade" | "marrow" | "marrowfat peas" | "marsala wine" | "marshmallow" | "marzipan" | "mascarpone" | "mashed potato" | "matzo" | "mayonnaise" | "meat" | "medlars" | "melon" | "meringue" | "milk" | "milk chocolate" | "mince" | "mince pies" | "mincemeat" | "mint" | "mint sauce" | "mirin" | "miso" | "mixed berries" | "mixed nuts" | "mixed spice" | "mixed spices" | "molasses" | "monkfish" | "morel" | "mortadella" | "mozzarella" | "muesli" | "muffins" | "mung beans" | "mung dal" | "mushroom" | "mussels" | "mustard" | "mustard cress" | "mustard powder" | "mustard seeds" | "mutton" | "naan bread" | "nachos" | "nasturtium" | "nectarine" | "nettle" | "new potatoes" | "nibbed almonds" | "nigella seeds" | "noodles" | "nori" | "nougat" | "nut" | "nutmeg" | "oatcakes" | "oatmeal" | "oats" | "octopus" | "offal" | "oil" | "oily fish" | "okra" | "olive" | "olive oil" | "onion" | "orange" | "orange juice" | "orange liqueur" | "oregano" | "ouzo" | "oxtail" | "oyster" | "oyster mushrooms" | "oyster sauce" | "paella" | "pak choi" | "palm oil" | "palm sugar" | "pancakes" | "pancetta" | "panch phoran" | "pandan leaves" | "paneer" | "panettone" | "papaya" | "pappardelle" | "paprika" | "paratha" | "parma ham" | "parmesan" | "parsley" | "parsnip" | "partridge" | "passata" | "passion fruit" | "passion fruit juice" | "pasta" | "pasta sauce" | "pastrami" | "pastry" | "pasty" | "p\u00e2t\u00e9" | "pea shoots" | "peach" | "peanut butter" | "peanut oil" | "peanuts" | "pear" | "pearl barley" | "peas" | "pecan" | "pecorino" | "pectin" | "peel" | "penne" | "pepper" | "peppercorn" | "pepperoni" | "perry" | "pesto" | "pheasant" | "piccalilli" | "pickle" | "pickled onion" | "pie" | "pigeon" | "pigeon peas" | "pine nut" | "pineapple" | "pineapple juice" | "pink fir apple" | "pink peppercorn" | "pinto beans" | "pistachio" | "pitta bread" | "plaice" | "plain flour" | "plantain" | "plum" | "polenta" | "pollack" | "pollock" | "pomegranate" | "pomegranate juice" | "pomegranate molasses" | "pomelo" | "popcorn" | "poppy seeds" | "porcini" | "pork" | "pork belly" | "pork chop" | "pork fillet" | "pork leg" | "pork loin" | "pork mince" | "pork sausages" | "pork shoulder" | "pork spare rib" | "porridge" | "port" | "portobello mushrooms" | "potato" | "potato wedges" | "poultry" | "poussin" | "prawn" | "prawn crackers" | "preserved lemons" | "preserves" | "pretzels" | "prosciutto" | "prune" | "pudding rice" | "puff pastry" | "pulled pork" | "pumpernickel bread" | "pumpkin" | "pumpkin seed" | "purple sprouting broccoli" | "puy lentils" | "quail" | "quails' egg" | "quark" | "quince" | "quinoa" | "quorn" | "rabbit" | "rack of lamb" | "radicchio" | "radish" | "rainbow chard" | "rainbow trout" | "raisins" | "raita" | "rapeseed oil" | "ras-el-hanout" | "raspberry" | "raspberry jam" | "ratafia biscuits" | "ratatouille" | "red cabbage" | "red leicester" | "red lentil" | "red mullet" | "red onion" | "red rice" | "red snapper" | "red wine" | "red wine vinegar" | "redcurrant" | "redcurrant jelly" | "rennet" | "rhubarb" | "rib of beef" | "rice" | "rice flour" | "rice noodles" | "rice vinegar" | "rice wine" | "ricotta" | "rigatoni" | "risotto rice" | "roast beef" | "roast chicken" | "roast lamb" | "roast pork" | "roast potatoes" | "roasted vegetables" | "rock salt" | "rocket" | "root vegetable" | "roquefort" | "rosemary" | "rosewater" | "royal icing" | "rum" | "rump" | "runner beans" | "rye bread" | "rye flour" | "saffron" | "sage" | "sage derby" | "salad" | "salad leaves" | "salami" | "salmon" | "salsa" | "salsify" | "salt" | "salt beef" | "salt cod" | "samphire" | "sardine" | "satay" | "satsuma" | "sauces" | "saucisson" | "sauerkraut" | "sausage" | "savory" | "savoy cabbage" | "scallop" | "scotch bonnet chilli" | "scrag" | "sea bass" | "sea bream" | "sea salt" | "seafood" | "seasoning" | "seaweed" | "seeds" | "self-raising flour" | "semolina" | "serrano ham" | "sesame oil" | "sesame seeds" | "seville orange" | "shallot" | "sharon fruit" | "shellfish" | "sherry" | "sherry vinegar" | "shiitake mushroom" | "shin" | "shortbread" | "shortcrust pastry" | "sichuan pepper" | "silverside" | "single cream" | "sirloin" | "skate" | "sloe" | "sloe gin" | "smoked cheese" | "smoked fish" | "smoked haddock" | "smoked mackerel" | "smoked paprika" | "smoked salmon" | "smoked trout" | "soba noodles" | "soda bread" | "soda water" | "sorrel" | "soup" | "sourdough bread" | "soured cream" | "soy sauce" | "soya beans" | "soya flour" | "soya milk" | "spaghetti" | "sparkling wine" | "spelt" | "spelt flour" | "spices" | "spinach" | "split peas" | "sponge cake" | "spring greens" | "spring onion" | "spring roll wrappers" | "squash" | "squid" | "sriracha" | "star anise" | "steak" | "stem ginger" | "stewing lamb" | "stilton" | "stock" | "strawberry" | "strawberry jam" | "strong white flour" | "stuffing" | "suet" | "sugar" | "sugar-snap peas" | "sultanas" | "sumac" | "summer fruit" | "sunflower oil" | "sunflower seed" | "sushi rice" | "swede" | "sweet potato" | "sweet sherry" | "sweetbread" | "sweetcorn" | "sweets" | "swiss chard" | "swiss rolls and roulades" | "swordfish" | "syrup" | "t-bone steak" | "tabasco" | "taco" | "tagliatelle" | "tahini" | "taleggio" | "tamari" | "tamarind" | "tangerine" | "tapenade" | "tapioca" | "tarragon" | "tayberry" | "tea" | "tequila" | "teriyaki sauce" | "thai basil" | "thyme" | "tilapia" | "tinned tuna" | "toffee" | "tofu" | "tomatillo" | "tomato" | "tomato chutney" | "tomato juice" | "tomato pur\u00e9e" | "tongue" | "tonic" | "topside" | "treacle" | "trout" | "truffle" | "truffle oil" | "turbot" | "turkey" | "turkey breast" | "turkey mince" | "turkish delight" | "turmeric" | "turnip" | "urid dal" | "vacherin" | "vanilla bean paste" | "vanilla essence" | "vanilla extract" | "vanilla pod" | "veal" | "vegetable oil" | "vegetable shortening" | "vegetable stock" | "vegetables" | "vegetarian sausage" | "venison" | "vermicelli (pasta)" | "vermouth" | "vine leaves" | "vinegar" | "vodka" | "walnut" | "walnut oil" | "wasabi" | "water chestnut" | "watercress" | "watermelon" | "waxy potato" | "wensleydale" | "wheatgerm" | "whelk" | "whipping cream" | "whisky" | "whisky liqueur" | "white bread" | "white cabbage" | "white chocolate" | "white fish" | "white pepper" | "white wine" | "white wine vinegar" | "whitecurrant" | "whiting" | "whole wheat pasta" | "wholegrain mustard" | "wholemeal bread" | "wholemeal flour" | "wild garlic" | "wild mushrooms" | "wild rice" | "wine" | "wood pigeon" | "worcestershire sauce" | "wraps" | "yam" | "yeast" | "yeast extract" | "yoghurt" | "yuzu" | "zest")
diff --git a/terminals/Preposition.lark b/terminals/Preposition.lark
new file mode 100755
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/terminals/Utensil.lark b/terminals/Utensil.lark
new file mode 100755
index 0000000000000000000000000000000000000000..45dc86814a5b97d1e917f90b4a35b57de1552565
--- /dev/null
+++ b/terminals/Utensil.lark
@@ -0,0 +1,98 @@
+UTENSIL = (Apple corer
+Apple cutter
+Baster
+Beanpot
+Biscuit press
+Blow torch
+Boil over preventer
+Bottle opener
+Bowl
+Bread knife
+Browning tray
+Butter curler
+Cake and pie server
+Cheese cutter
+Cheese knife
+Cheese slicer
+Cheesecloth
+Chef's knife
+Cherry pitter
+Chinois
+Clay pot
+Cleaver
+Colander
+Cookie cutter
+Corkscrew
+Crab cracker
+Cutting board
+Dough scraper
+Edible tableware
+Egg piercer
+Egg poacher
+Egg separator
+Egg slicer
+Egg timer
+Fat separator
+Fillet knife
+Fish scaler
+Fish slice
+Flour sifter
+Food mill
+Funnel
+Garlic press
+Grapefruit knife
+Grater
+Herb chopper
+Honey dipper
+Ladle
+Lame
+Lemon reamer
+Lemon squeezer
+Lobster pick
+Mandoline
+Mated colander pot
+Measuring cup
+Measuring spoon
+Meat grinder
+Meat tenderiser
+Meat thermometer
+Melon baller
+Mezzaluna
+Microplane
+Milk frother
+Mortar and pestle
+Nutcracker
+Nutmeg grater
+Oven glove
+Pastry bag
+Pastry blender
+Pastry brush
+Peel
+Peeler
+Pepper mill
+Pie bird
+Pizza cutter
+Potato masher
+Potato ricer
+Pot-holder
+Poultry shears
+Roller docker
+Rolling pin
+Salt shaker
+Scales
+Scissors
+Scoop
+Sieve
+Slotted spoon
+Spatula
+Spider
+Sugar thermometer
+Tamis
+Tin opener
+Tomato knife
+Tongs
+Trussing needle
+Twine
+Whisk
+Wooden spoon
+Zester
diff --git a/test_parser.py b/test/parser.py
old mode 100644
new mode 100755
similarity index 100%
rename from test_parser.py
rename to test/parser.py
diff --git a/test_preprocessor.py b/test/preprocessor.py
old mode 100644
new mode 100755
similarity index 100%
rename from test_preprocessor.py
rename to test/preprocessor.py
diff --git a/test/scraper.py b/test/scraper.py
new file mode 100755
index 0000000000000000000000000000000000000000..12c03626c4b518dba59e8fc50284dd9ad3d1bc5a
--- /dev/null
+++ b/test/scraper.py
@@ -0,0 +1,7 @@
+import requests
+from bs4 import BeautifulSoup
+sitemap = "http://101cookbooks.com/"
+soup = BeautifulSoup(requests.get(sitemap).text, 'html.parser')
+urls = soup.find_all("a")
+for url in urls:
+    print(url.get("href"))
diff --git a/web.rdf b/web.rdf
new file mode 100644
index 0000000000000000000000000000000000000000..f7bdfa7f6d4d0c8ac15dec6584bfbf7bed938fe7
--- /dev/null
+++ b/web.rdf
@@ -0,0 +1,34 @@
+
+<!-- Processed by Id: cwm.py,v 1.197 2007/12/13 15:38:39 syosi Exp -->
+<!--     using base file:///home/liam/fyp/ontology.n3-->
+
+
+<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/"
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+
+    <rdf:Description rdf:about="">
+        <dc:title>Primer - Getting into the Semantic Web and RDF using N3</dc:title>
+    </rdf:Description>
+
+    <rdfs:Class rdf:about="#Ingredient">
+    </rdfs:Class>
+
+    <rdfs:Class rdf:about="#Collection">
+    </rdfs:Class>
+
+    <rdfs:Class rdf:about="#Menu">
+        <rdfs:subClassOf rdf:resource="#Collection"/>
+    </rdfs:Class>
+
+    <rdfs:Class rdf:about="#Recipe">
+    </rdfs:Class>
+
+    <rdfs:Class rdf:about="#Food">
+    </rdfs:Class>
+
+    <rdfs:Class rdf:about="#StageSequence">
+    </rdfs:Class>
+
+    <rdfs:Property rdf:about="#hasAllergens">
+    </rdfs:Property>
+</rdf:RDF>