module SQLiterate

grammar Identifier
  include Keywords

  rule identifier
    literal_identifier / quoted_identifier
  end

  rule literal_identifier
    !keyword [\p{Alpha}_] [\p{Alnum}_$]*  <Node::LiteralIdentifier>
  end

  rule quoted_identifier
    '"' c:( identifier_char )* '"' <Node::QuotedIdentifier>
  end

  rule identifier_char
    '""' <Node::IdentifierChar::Quote>
    /
    [^"] <Node::IdentifierChar::Text>
  end

  rule qualified_name
    schema_name '.' identifier <Node::QualifiedName>
    /
    table_name
  end

  rule schema_name
    identifier
  end

  rule table_name
    identifier
  end

  rule column_name
    identifier
  end

  rule all_fields
    '*' <Node::AllFields>
  end
end

end