private Dictionary <TermMetaData, Term> StoreMetadata(NonAcTerm nonAcTerm)
        {
            var metadata = new Dictionary <TermMetaData, Term>();

            var identifiers = nonAcTerm.ClassMemberMappings?.ClassMembers?.Cast <ITrlTerm>().ToList();

            if (identifiers == null || !identifiers.Any())
            {
                return(metadata);
            }

            // Store field mappings as a list
            TermList classMappings = new TermList
            {
                Terms = identifiers
            };

            metadata.Add(TermMetaData.ClassMemberMappings, StoreTerm(classMappings));

            return(metadata);
        }
Exemple #2
0
        private void CreateSemanticActions()
        {
            var replaceQuotesRegex = new Regex("(^\")|(\"$)", RegexOptions.Compiled);

            _pegFacade.DefaultSemanticActions.SetDefaultGenericPassthroughAction <GenericResult>();

            _pegFacade.DefaultSemanticActions.OrderedChoiceAction = (_, subResults, pegSpec) => subResults.First();

            _pegFacade.DefaultSemanticActions.OptionalAction = (_, subResults, pegSpec) => subResults.FirstOrDefault();

            _pegFacade.DefaultSemanticActions.SetTerminalAction(TokenNames.Identifier,
                                                                (matchedTokens, _, pegSpec) => new Identifier {
                Name = matchedTokens.GetMatchedString()
            });

            _pegFacade.DefaultSemanticActions.SetTerminalAction(TokenNames.String,
                                                                (matchedTokens, _, pegSpec) => new StringValue {
                Value = replaceQuotesRegex.Replace(matchedTokens.GetMatchedString(), string.Empty)
            });

            _pegFacade.DefaultSemanticActions.SetTerminalAction(TokenNames.Number,
                                                                (matchedTokens, _, pegSpec) => new NumericValue {
                Value = matchedTokens.GetMatchedString()
            });

            _pegFacade.DefaultSemanticActions.SetTerminalAction(TokenNames.Variable,
                                                                (matchedTokens, _, pegSpec) => new Variable {
                Name = matchedTokens.GetMatchedString()
            });

            _pegFacade.DefaultSemanticActions.SetNonTerminalAction(ParseRuleNames.Statement, (_, subResults, pegSpec) => subResults.First());

            _pegFacade.DefaultSemanticActions.SetNonTerminalAction(ParseRuleNames.Term,
                                                                   (_, subResults, pegSpec) => subResults.First());

            _pegFacade.DefaultSemanticActions.SetNonTerminalAction(ParseRuleNames.Start,
                                                                   (_, subResults, pegSpec) =>
            {
                var oneOrMore = subResults.Cast <GenericResult>().Single();
                StatementList statementList = new StatementList
                {
                    Statements   = new List <TermStatement>(),
                    RewriteRules = new List <RewriteRule>()
                };
                foreach (var nestedBrackets in oneOrMore.SubResults.Cast <GenericResult>())
                {
                    // Rewrite rule statements
                    var rewriteRule = nestedBrackets.SubResults[0] as RewriteRule;
                    if (rewriteRule != null)
                    {
                        statementList.RewriteRules.Add(rewriteRule);
                        continue;
                    }

                    // Term statements
                    var sequence = (GenericResult)nestedBrackets.SubResults[0];
                    if (sequence != null)     // empty statement generated by ";;;" type input
                    {
                        var label = sequence.SubResults[0];
                        var term  = sequence.SubResults.Skip(1).First();
                        if (term != null)     // optional case: where we have a string of semi-colons
                        {
                            statementList.Statements.Add(new TermStatement
                            {
                                Label = (Label)label,
                                Term  = (ITrlTerm)term
                            });
                        }
                    }
                }
                return(statementList);
            });

            _pegFacade.DefaultSemanticActions.SetNonTerminalAction(ParseRuleNames.Label, (matchTokens, subResults, matchedSpec) =>
            {
                var returnLabel = new Label
                {
                    Identifiers = new List <Identifier>()
                };
                var concatResults  = subResults.First().GetSubResults();
                var identifierHead = (Identifier)concatResults[0];
                returnLabel.Identifiers.Add(identifierHead);
                var starResults = concatResults[1].GetSubResults()[0];
                foreach (var nextIdentifier in starResults.GetSubResults())
                {
                    returnLabel.Identifiers.Add((Identifier)nextIdentifier.GetSubResults()[1]);
                }
                return(returnLabel);
            });

            _pegFacade.DefaultSemanticActions.SetNonTerminalAction(ParseRuleNames.TermList, (matchTokens, subResults, matchedSpec) =>
            {
                var listResult = subResults.First().GetSubResults()[1]; // skip over "("
                var cst        = (CommaSeperatedTerms)listResult.GetSubResults()[0];
                return(new TermList
                {
                    Terms = cst.Terms
                });
            });

            _pegFacade.DefaultSemanticActions.SetNonTerminalAction(ParseRuleNames.CommaSeperatedTerms, (matchTokens, subResults, matchedSpec) =>
            {
                var termList = new CommaSeperatedTerms
                {
                    Terms = new List <ITrlTerm>()
                };
                var results = subResults?.FirstOrDefault()?.GetSubResults();
                var head    = results?[0];
                if (head != null)
                {
                    termList.Terms.Add((ITrlTerm)head);
                    // Skip over commas
                    var tail = results[1].GetSubResults();
                    foreach (var tailResult in tail)
                    {
                        var term = tailResult.GetSubResults()[1];
                        termList.Terms.Add((ITrlTerm)term);
                    }
                }
                return(termList);
            });

            _pegFacade.DefaultSemanticActions.SetNonTerminalAction(ParseRuleNames.ClassMemberMapping, (matchTokens, subResults, matchedSpec) =>
            {
                var mappings = new ClassMemberMappingsList
                {
                    ClassMembers = new List <Identifier>()
                };
                var results = subResults?.FirstOrDefault()?.GetSubResults();
                if (results?[1].GetSubResults()[0] != null)
                {
                    var list = results?[1].GetSubResults()[0].GetSubResults();
                    if (list[0] != null)
                    {
                        mappings.ClassMembers.Add((Identifier)list[0]);
                        var tail = list[1].GetSubResults();
                        foreach (var tailResult in tail)
                        {
                            var id = tailResult.GetSubResults()[1];
                            mappings.ClassMembers.Add((Identifier)id);
                        }
                    }
                }
                return(mappings);
            });

            _pegFacade.DefaultSemanticActions.SetNonTerminalAction(ParseRuleNames.NonACTerm, (matchTokens, subResults, matchedSpec) =>
            {
                var term          = new NonAcTerm();
                var concatResults = subResults?.FirstOrDefault()?.GetSubResults();
                term.TermName     = (Identifier)concatResults[0];
                var tail          = concatResults[1].GetSubResults();
                if (tail.Count == 2)
                {
                    term.ClassMemberMappings = (ClassMemberMappingsList)tail[0];
                    term.Arguments           = ((CommaSeperatedTerms)tail[1].GetSubResults()[1].GetSubResults()[0]).Terms;
                }
                else if (tail.Count == 1)
                {
                    term.Arguments = ((CommaSeperatedTerms)tail[0]).Terms;
                }
                else
                {
                    throw new Exception(); // there could only be 1 or 2 results
                }
                return(term);
            });

            _pegFacade.DefaultSemanticActions.SetNonTerminalAction(ParseRuleNames.RewriteRule, (matchTokens, subResults, matchedSpec) =>
            {
                return(new RewriteRule
                {
                    MatchTerm = (ITrlTerm)subResults.First().GetSubResults().First(),
                    SubstituteTerm = (ITrlTerm)subResults.First().GetSubResults()[1].GetSubResults()[1]
                });
            });
        }