1 using Mercury.Scanning;
3 using System.Collections;
4 using System.Collections.Generic;
7 namespace Mercury.Syntax
28 IEnumerable<Rule> Scan(IEnumerable<Token> tokens);
46 private List<IScanner> scanners;
54 { scanners =
new List<IScanner>(); }
62 {
foreach (var scanner
in scanners) Add(scanner); }
74 if (scanners.Contains(scanner))
return this;
76 scanners.Add(scanner);
85 scanners.Remove(scanner);
93 public IEnumerable<Rule>
Scan(IEnumerable<Token> tokens)
94 {
return scanners.Select(scanner => scanner.Scan(tokens)).Aggregate((x, y) => x.Concat(y)); }
98 #region [ IEnumerable ]
100 public IEnumerator<IScanner>
GetEnumerator() {
return scanners.GetEnumerator(); }
102 IEnumerator IEnumerable.GetEnumerator() {
return scanners.GetEnumerator(); }
136 private IDictionary<TokenType, Mapping> map;
147 if (map == null)
throw new ArgumentNullException(
"map");
154 #region [ Predefined maps ]
159 { TokenType.Symbol, Mapping.AsSymbol },
160 { TokenType.Number, Mapping.AsNumber },
161 { TokenType.Keyword, Mapping.AsKeyword },
162 { TokenType.String, Mapping.AsString },
168 { TokenType.Symbol, Mapping.AsString },
169 { TokenType.Number, Mapping.AsNumber },
170 { TokenType.Keyword, Mapping.AsString },
171 { TokenType.String, Mapping.AsString },
177 { TokenType.Symbol, Mapping.All },
178 { TokenType.Number, Mapping.All },
179 { TokenType.Keyword, Mapping.All },
180 { TokenType.String, Mapping.All },
190 { TokenType.Symbol, custom },
191 { TokenType.Number, custom },
192 { TokenType.Keyword, custom },
193 { TokenType.String, custom },
212 if (map.TryGetValue(ttype, out mapping))
235 private Rule MakeRule(
string lhs,
Token rhs)
247 if (map == null)
throw new ArgumentNullException(
"map");
256 public IEnumerable<Rule>
Scan(IEnumerable<Token> tokens)
258 foreach(
Token token
in tokens)
260 Mapping mapping = map[token.Type];
262 if (mapping.HasFlag(
Mapping.AsKeyword)) yield
return MakeRule(
"@Keyword", token);
263 if (mapping.HasFlag(
Mapping.AsNumber)) yield
return MakeRule(
"@Number", token);
264 if (mapping.HasFlag(
Mapping.AsString)) yield
return MakeRule(
"@String", token);
265 if (mapping.HasFlag(
Mapping.AsSymbol)) yield
return MakeRule(
"@Symbol", token);
Generates four Nonterminals @Symbol, @Keyword, @Number and @String based on the given map and types o...
Contains mapping between TokenType and Mercury.Syntax.Mapping of Mercury.Syntax.BasicScanner.
Maps token to symbol, keyword, number and string
IEnumerable< Rule > Scan(IEnumerable< Token > tokens)
Scans input tokens and creates additional rules for parsing.
Mercury.Syntax.IScanner implementation that behaves like container of scanners using the Composite De...
Token, a part of an input text recognized by tokenizer
Maps token to number (@Number -> token)
Maps token to symbol (@Symbol -> token)
Mapping GetMapping(TokenType ttype)
Returns the mapping for a given TokenType.
IScanner Add(IScanner scanner)
Adds the specified scanner to the container. If the scanner is already present, this method will have...
IScanner Remove(IScanner scanner)
Removes the scanner from the container.
IEnumerator< IScanner > GetEnumerator()
Maps token to string (@String -> token)
Maps token to keyword (@Keyword -> token)
static BasicScannerMap SingleMap(Mapping custom)
Creates a mapping for all TokenTypes to custom Mapping
IEnumerable< Rule > Scan(IEnumerable< Token > tokens)
Scans input tokens and creates additional rules for parsing.
TokenType
Defines token types. The actual conditions depend on the Mercury.Scanning.ITokenizer implementation...
CompositeScanner()
Creates an empty Composite scanner.
Represents a Context-Free Grammar rule. This is an immutable class.
Scanner scans input tokens and creates additional rules for parsing.
BasicScannerMap(IDictionary< TokenType, Mapping > map)
Creates a new instance of Mercury.Syntax.BasicScannerMap.
Represents a single symbol of the grammar. This is an immutable class. For a symbol name to be val...
CompositeScanner(IEnumerable< IScanner > scanners)
Creates a scanner initialized by source scanners.
BasicScanner(BasicScannerMap map)
Initializes a new instance of the BasicScanner class.