Skip to content

Method: NameParser(TokenStream)

1: package de.fhdw.wtf.parser;
2:
3: import de.fhdw.wtf.common.ast.Name;
4: import de.fhdw.wtf.common.ast.UnqualifiedName;
5: import de.fhdw.wtf.common.exception.parser.NoIdentifierException;
6: import de.fhdw.wtf.common.stream.TokenStream;
7:
8: /**
9: * Parser to parse the given TokenStream to {@link Name}s.
10: */
11: final class NameParser {
12:         
13:         /**
14:          * TokenStream.
15:          */
16:         private final TokenStream stream;
17:         
18:         /**
19:          * Constructor of {@link NameParser}.
20:          *
21:          * @param stream
22:          * tokenStream
23:          */
24:         private NameParser(final TokenStream stream) {
25:                 this.stream = stream;
26:         }
27:         
28:         /**
29:          * FactoryMethod for {@link NameParser}.
30:          *
31:          * @param stream
32:          * tokenStream
33:          * @return The {@link NameParser}-Object.
34:          */
35:         static NameParser createNameParser(final TokenStream stream) {
36:                 return new NameParser(stream);
37:         }
38:         
39:         /**
40:          * Parses the next series of Token of stream to Name.
41:          *
42:          * @return Name
43:          * @throws NoIdentifierException
44:          * NoIdentifierException
45:          */
46:         Name parse() throws NoIdentifierException {
47:                 Name newName = UnqualifiedName.create(ParserUtils.requireAndRemoveIdentifier(this.stream), this.stream.peek());
48:                 
49:                 while (this.stream.hasNext() && this.stream.peek().isGreaterSymbolToken()) {
50:                         this.stream.removeFirst();
51:                         newName = newName.addName(ParserUtils.requireAndRemoveIdentifier(this.stream));
52:                 }
53:                 return newName;
54:         }
55:         
56: }