Exemplo n.º 1
0
        public override CParser CreateCParser(TextReader rdr, ParserState?state)
        {
            state ??= new ParserState();
            var lexer  = new CLexer(rdr, CLexer.MsvcKeywords);
            var parser = new CParser(state, lexer);

            return(parser);
        }
Exemplo n.º 2
0
        public ParseAction TransitionedOn(Symbol symbol, out ParserState?targetState)
        {
            var items       = Expand();
            var transitions = new HashSet <Transition>();

            foreach (var item in items)
            {
                var(target, action) = mCfg.FindTransitionOfItemOn(item, symbol);
                if (action.Type == ParseActionType.Discard)
                {
                    continue;
                }
                var transition = new Transition(action, item, target);
                transitions.Add(transition);
            }

            if (transitions.Count == 0)
            {
                targetState = null;
                return(ParseAction.MakeReject());
            }

            if (transitions.Any(t => t.Action.Type == ParseActionType.Accept))
            {
                targetState = null;
                return(ParseAction.MakeAccept());
            }

            if (transitions.Any(t => t.Action.Type == ParseActionType.Reduce && (
                                    mCfg.AssociativityOf(t.Action.Production) == Associativity.Left ||
                                    mCfg.PrecedenceOf(t.Action.Production) > mCfg.PrecedenceOf(symbol))))
            {
                transitions.RemoveWhere(t => t.Action.Type != ParseActionType.Reduce);
                if (transitions.Count > 1)
                {
                    throw new Exception("There is a reduce-reduce conflict.");
                }
                targetState = null;
                return(ParseAction.MakeReduce(transitions.First().Action.Production));
            }

            if (transitions.All(t => t.Action.Type == ParseActionType.Reduce))
            {
                if (transitions.Count > 1)
                {
                    throw new Exception("There is a reduce-reduce conflict.");
                }
                targetState = null;
                return(ParseAction.MakeReduce(transitions.First().Action.Production));
            }

            transitions.RemoveWhere(t => t.Action.Type != ParseActionType.Shift);

            if (transitions.Count == 0)
            {
                targetState = null;
                return(ParseAction.MakeReject());
            }

            targetState = new ParserState(
                mCfg,
                transitions
                .Select(t => t.Dest ?? throw new NullReferenceException())
                .ToHashSet());
            return(ParseAction.MakeShift());
        }
Exemplo n.º 3
0
 public CommandLineException(ParserState args, string message, Exception innerException)
     : base(message, innerException)
 {
     this.Args = args;
 }