def _lex_rhs(stream: TokenStream, gram: Grammar) -> _Literal: """FIXME: How should we define lexical productions?""" token = stream.take() if token.kind == TokenCat.STRING or token.kind == TokenCat.NUMBER: return gram.literal(token.value) else: raise InputError(f"Lexical RHS should be string literal or integer")
def _bnf_symbol(stream: TokenStream, gram: Grammar) -> RHSItem: """A single identifier or literal, or a parenthesized group""" if stream.peek().kind == TokenCat.LPAREN: stream.take() subseq = _bnf_rhs(stream, gram) require(stream, TokenCat.RPAREN, consume=True) # log.debug(f"Subsequence group: {subseq}") return subseq token = stream.take() if token.kind == TokenCat.STRING or token.kind == TokenCat.CHAR: # log.debug("Forming literal") return gram.literal(token.value[1:-1]) # Clips quotes elif token.kind == TokenCat.IDENT: # log.debug("Forming symbol") return gram.symbol(token.value) else: raise InputError(f"Unexpected input token {token.value}")