⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 antlrdfa.m

📁 antlr最新版本V3源代码
💻 M
字号:
// [The "BSD licence"]// Copyright (c) 2006-2007 Kay Roepke// All rights reserved.//// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions// are met:// 1. Redistributions of source code must retain the above copyright//    notice, this list of conditions and the following disclaimer.// 2. Redistributions in binary form must reproduce the above copyright//    notice, this list of conditions and the following disclaimer in the//    documentation and/or other materials provided with the distribution.// 3. The name of the author may not be used to endorse or promote products//    derived from this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#import "ANTLRDFA.h"#import <ANTLR/ANTLRToken.h>#import <ANTLR/ANTLRNoViableAltException.h>static BOOL debug = NO;@implementation ANTLRDFA- (id) initWithRecognizer:(ANTLRBaseRecognizer *) theRecognizer{	if ((self = [super init])) {		recognizer = theRecognizer;	}	return self;}// using the tables ANTLR generates for the DFA based prediction this method simulates the DFA// and returns the prediction of the alternative to be used.- (int) predict{	id<ANTLRIntStream> stream = [recognizer input];		unsigned int mark = [stream mark];	int s = 0;	@try {		while (YES) {			if ( debug ) NSLog(@"DFA %d state %d LA(1)=%c(%d)", decisionNumber, s, (unichar)[stream LA:1], [stream LA:1]);			int specialState = special[s];			if (specialState >= 0) {				// this state is special in that it has some code associated with it. we cannot do this in a pure DFA so				// we signal the caller accordingly.				if ( debug ) NSLog(@"DFA %d state %d is special state %d", decisionNumber, s, specialState);				s = [self specialStateTransition:specialState];				[stream consume];				continue;			}			// if this is an accepting state return the prediction			if (accept[s] >= 1) {				if ( debug ) NSLog(@"accept; predict %d from state %d", accept[s], s);				return accept[s];			}			// based on the lookahead lookup the next transition, consume and do transition			// or signal that we have no viable alternative			int c = [stream LA:1];			if ( (unichar)c >= min[s] && (unichar)c <= max[s]) {				int snext = transition[s][c-min[s]];				if (snext < 0) {					if (eot[s] >= 0) {						if ( debug ) NSLog(@"EOT transition");						s = eot[s];						[stream consume];						continue;					}					[self noViableAlt:s];					return 0;				}				s = snext;				[stream consume];				continue;			}			// we are the end of the token, consume and do transition. we may still accept the input in the next state			if (eot[s] >= 0) {				if ( debug ) NSLog(@"EOT transition");				s = eot[s];				[stream consume];				continue;			}			// we are at EOF and may even accept the input.			if ( c == ANTLRTokenTypeEOF && eof[s] >= 0) {				if ( debug ) NSLog(@"accept via EOF; predict %d from %d", accept[eof[s]], eof[s]);				return accept[eof[s]];			}			if (debug) NSLog(@"no viable alt!");			[self noViableAlt:s];		}	}	@finally {		[stream rewind:mark];	}	return 0; // silence warning}- (void) noViableAlt:(int) state{	id<ANTLRIntStream> stream = [recognizer input];	if ([recognizer isBacktracking]) {		[recognizer setIsFailed:YES];		return;	}	ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException exceptionWithDecision:decisionNumber state:state stream:stream];	[self error:nvae];	@throw nvae;}- (int) specialStateTransition:(int) state{	return 0;}- (void) error:(ANTLRNoViableAltException *)nvae{	// empty, hook for debugger support}- (NSString *) description{	return @"subclass responsibility";}- (BOOL) evaluateSyntacticPredicate:(SEL)synpredFragment{	return [recognizer evaluateSyntacticPredicate:synpredFragment];}+ (void) setIsEmittingDebugInfo:(BOOL) shouldEmitDebugInfo{	debug = shouldEmitDebugInfo;}@end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -