code: def update_grammar_to_be_variable_free(grammar_dictionary: Dict[str, List[str]]):
      
  
      # Tables in variable free grammars cannot be aliased, so we
      # remove this functionality from the grammar.
      grammar_dictionary["select_result"] = ['"*"', '(table_name ws ".*")', 'expr']
  
      # Similarly, collapse the definition of a source table
      # to not contain aliases and modify references to subqueries.
      grammar_dictionary["single_source"] = ['table_name', '("(" ws query ws ")")']
      del grammar_dictionary["source_subq"]
      del grammar_dictionary["source_table"]
  
      grammar_dictionary["expr"] = ['in_expr',
                                    '(value wsp "LIKE" wsp string)',
                                    '(value ws "BETWEEN" wsp value ws "AND" wsp value)',
                                    '(value ws binaryop wsp expr)',
                                    '(unaryop ws expr)',
                                    '(col_ref ws "IS" ws "NOT" ws "NULL")',
                                    '(col_ref ws "IS" ws "NULL")',
                                    # This used to be source_subq - now
                                    # we don't need aliases, we can colapse it to queries.
                                    '("(" ws query ws ")")',
                                    'value']
  
      # Finally, remove the ability to reference an arbitrary name,
      # because now we don't have aliased tables, we don't need
      # to recognise new variables.
      del grammar_dictionary["name"]
docs: SQL is a predominately variable free language in terms of simple usage, in the
      sense that most queries do not create references to variables which are not
      already static tables in a dataset. However, it is possible to do this via
      derived tables. If we don't require this functionality, we can tighten the
      grammar, because we don't need to support aliased tables.