You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: identifiers.rs
    path of file: ./repos/boa/core/parser/src/parser/expression
    
    the code of the file until where you have to start completion: //! Identifiers parsing.
//!
//! More information:
//!  - [ECMAScript specification][spec]
//!
//! [spec]: https://tc39.es/ecma262/#sec-identifiers

use crate::{
    lexer::TokenKind,
    parser::{cursor::Cursor, AllowAwait, AllowYield, OrAbrupt, ParseResult, TokenParser},
    source::ReadChar,
    Error,
};
use boa_ast::expression::Identifier as AstIdentifier;
use boa_interner::{Interner, Sym};
use boa_profiler::Profiler;

/// Identifier reference parsing.
///
/// More information:
///  - [ECMAScript specification][spec]
///
/// [spec]: https://tc39.es/ecma262/#prod-IdentifierReference
#[derive(Debug, Clone, Copy)]
pub(in
    
    fn parse(self, cursor: &mut Cursor<R>, interner: &mut Interner) -> ParseResult<Self::Output> {
        let _timer = Profiler::global().start_event("IdentifierReference", "Parsing");

        let span = cursor.peek(0, interner).or_abrupt()?.span();
        let ident = Identifier.parse(cursor, interner)?;
        match ident.sym() {
            Sym::YIELD if self.allow_yield.0 => Err(Error::unexpected(
                "yield",
                span,
                "keyword `yield` not allowed in this context",
            )),
            Sym::AWAIT if self.allow_await.0 => Err(Error::unexpected(
                "await",
                span,
                "keyword `await` not allowed in this context",
            )),
            _ => Ok(ident),
        }
    }