Пример #1
0
        protected override object GetObject(Match match, CultureInfo cultureInfo)
        {
            var groups = match.Groups;
            var entry  = new ParsedEntry();

            if (_nameGroupId > -1)
            {
                entry.Name = groups[_nameGroupId].Value;
            }
            if (_quantityGroupId > -1)
            {
                entry.Quantity = Convert.ToDouble(groups[_quantityGroupId].Value, cultureInfo);
            }
            if (_unitGroupId > -1)
            {
                entry.Unit = RegexHelper.ParseUnitOfMeasure(groups[_unitGroupId].Value);
            }

            return(entry);
        }
Пример #2
0
 private static void ParseStatementBlock(TokenProvider tp, ParsedEntry entry)
 {
     throw new NotImplementedException();
 }
Пример #3
0
        internal static ParsedEntry ParseFile(TokenProvider tp)
        {
            ParsedEntry ret = new ParsedEntry {
                Type = ParsedEntry.type.file, Tokens = tp.tokens
            };

            Preprocessor.token t = tp.Current;

            while (t.type != Preprocessor.token.token_type.beyond_eof)
            {
                if (t.type == Preprocessor.token.token_type.comment)
                {
                    t = tp.MoveNext();
                    continue;
                }

                List <Preprocessor.token> cur_tokens = new List <Preprocessor.token>();

                ParsedEntry entry = new ParsedEntry {
                    Tokens = cur_tokens
                };

                if (t.value == "typedef")
                {
                    cur_tokens.Add(t);
                    t = tp.MoveNext();
                    List <Preprocessor.token> typedef_to = MatchType(tp);
                    cur_tokens.AddRange(typedef_to);
                    t = tp.Current;
                    cur_tokens.Add(t);
                    string typedef_from = t.value;
                    t = tp.MoveNext();
                    if (t.value != ";")
                    {
                        throw new Exception();
                    }

                    typedefs.Add(typedef_from, typedef_to);
                    t          = tp.MoveNext();
                    entry.Type = ParsedEntry.type.typedef;
                }
                else
                {
                    // Parse type
                    List <Preprocessor.token> mtype = MatchType(tp);
                    if (mtype.Count == 0)
                    {
                        throw new Exception("Invalid type: " + tp.Current.value);
                    }
                    cur_tokens.AddRange(mtype);

                    // Read identifier
                    t = tp.Current;
                    if (t.type == Preprocessor.token.token_type.identifier)
                    {
                        cur_tokens.Add(t);
                        t = tp.MoveNext();
                    }

                    // See if we identify a function
                    if (t.value == "(")
                    {
                        // Function header
                        t = tp.MoveNext();

                        List <ParsedEntry> args = new List <ParsedEntry>();

                        while (t.value != ")")
                        {
                            List <Preprocessor.token> type = MatchType(tp);
                            cur_tokens.AddRange(type);
                            t = tp.Current;

                            if ((t.value != ")") && (t.value != ","))
                            {
                                type.Add(t);
                                cur_tokens.Add(t);
                                t = tp.MoveNext();
                            }

                            if (t.value == ")")
                            {
                                break;
                            }

                            if (t.value != ",")
                            {
                                throw new Exception();
                            }

                            args.Add(new ParsedEntry {
                                Type = ParsedEntry.type.variable_definition, Tokens = type
                            });

                            cur_tokens.Add(t);
                            t = tp.MoveNext();
                        }

                        entry.Children.AddRange(args);

                        cur_tokens.Add(t);
                        t = tp.MoveNext();

                        if (t.value == ";")
                        {
                            cur_tokens.Add(t);
                            t          = tp.MoveNext();
                            entry.Type = ParsedEntry.type.function_declaration;
                        }
                        else if (t.value == "{")
                        {
                            entry.Type = ParsedEntry.type.function_definition;
                            ParseStatementBlock(tp, entry);
                        }
                    }
                    else if (t.value == ";")
                    {
                        entry.Type = ParsedEntry.type.variable_definition;
                        cur_tokens.Add(t);
                        t = tp.MoveNext();
                    }
                    else if (t.value == "=")
                    {
                        entry.Type = ParsedEntry.type.variable_definition;
                        cur_tokens.Add(t);
                        t = tp.MoveNext();
                        ParseExpression(tp, entry);
                    }
                    else
                    {
                        throw new Exception();
                    }
                }

                ret.Children.Add(entry);
            }

            return(ret);
        }
Пример #4
0
 private static void ParseExpression(TokenProvider tp, ParsedEntry entry)
 {
     throw new NotImplementedException();
 }