|
2 | 2 | //! associated specifically with the wasm text format per se (useful in other
|
3 | 3 | //! contexts too perhaps).
|
4 | 4 |
|
5 |
| -use crate::annotation; |
6 |
| -use crate::lexer::Float; |
| 5 | +use crate::lexer::{Float, Lexer, TokenKind}; |
7 | 6 | use crate::parser::{Cursor, Parse, Parser, Peek, Result};
|
| 7 | +use crate::{annotation, Error}; |
8 | 8 | use std::fmt;
|
9 | 9 | use std::hash::{Hash, Hasher};
|
10 | 10 | use std::str;
|
@@ -58,8 +58,21 @@ pub struct Id<'a> {
|
58 | 58 | }
|
59 | 59 |
|
60 | 60 | impl<'a> Id<'a> {
|
61 |
| - fn new(name: &'a str, span: Span) -> Id<'a> { |
62 |
| - Id { name, gen: 0, span } |
| 61 | + /// Construct a new identifier from given string. |
| 62 | + /// |
| 63 | + /// Returns an error if the string does not contain a leading `$`, or is not a |
| 64 | + /// valid WASM text format identifier. |
| 65 | + pub fn new(name: &'a str, span: Span) -> Result<Id<'a>> { |
| 66 | + let mut _pos: usize = 0; |
| 67 | + let tok = Lexer::new(name).parse(&mut _pos)?; |
| 68 | + match tok { |
| 69 | + Some(tok) if tok.kind == TokenKind::Id => Ok(Id { |
| 70 | + name: tok.id(name), |
| 71 | + gen: 0, |
| 72 | + span, |
| 73 | + }), |
| 74 | + _ => Err(Error::parse(span, name, "expected an identifier".into())), |
| 75 | + } |
63 | 76 | }
|
64 | 77 |
|
65 | 78 | pub(crate) fn gensym(span: Span, gen: u32) -> Id<'a> {
|
@@ -106,7 +119,14 @@ impl<'a> Parse<'a> for Id<'a> {
|
106 | 119 | fn parse(parser: Parser<'a>) -> Result<Self> {
|
107 | 120 | parser.step(|c| {
|
108 | 121 | if let Some((name, rest)) = c.id()? {
|
109 |
| - return Ok((Id::new(name, c.cur_span()), rest)); |
| 122 | + return Ok(( |
| 123 | + Id { |
| 124 | + name, |
| 125 | + gen: 0, |
| 126 | + span: c.cur_span(), |
| 127 | + }, |
| 128 | + rest, |
| 129 | + )); |
110 | 130 | }
|
111 | 131 | Err(c.error("expected an identifier"))
|
112 | 132 | })
|
|
0 commit comments