//
//  EXPCCodeGenerator.h
//  dde
//
//  Created by ashley on 18/06/2008.
//  Copyright 2008 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
@class EXPError;
@class EXPBlockElement;
@class EXPExpression;
@class EXPConstant;
@class EXPParameterElement;
@class EXPAuxiliaryElement;
@class EXPStateElement;
@class EXPTableElement;
@class EXPFunctionElement;
@class EXPSymbolReference;
@class EXPUnaryOp;
@class EXPBinOp;
@class EXPTernOp;
@class EXPAssignmentOp;
@class EXPError;

@interface EXPCCodeGenerator : NSObject {
	NSString *_constantOutputMode;
	NSString *_outputString;
}

- (id) outputString;
- (void) outString:(NSString *)string;
- (void) indent:(int)level;
- (void) outLine:(NSString *)line /*toFile:(FILE *)f*/ indentationLevel:(int)level;
- (BOOL) generateConstant:(EXPConstant *)constant error:(EXPError *)error;
- (BOOL) generateParameter:(EXPParameterElement *)parameter error:(EXPError *)error;
- (BOOL) generateAuxiliary:(EXPAuxiliaryElement *)auxiliary error:(EXPError *)error;
- (BOOL) generateVariable:(EXPStateElement *)variable withArguments:(NSArray *)arguments dimensions:(NSArray *)dimensions withPrimes:(int)primes 
		 error:(EXPError *)error;
- (NSString *) tableVariableForName:(NSString *)name;
- (BOOL) generateTableFunctionCall:(EXPTableElement *)function withArguments:(NSArray *)arguments dimensions:(NSArray *)dimensions error:(EXPError *)error;
- (BOOL) generateFunctionCall:(EXPFunctionElement *)function withArguments:(NSArray *)arguments dimensions:(NSArray *)dimensions error:(EXPError *)error;
- (BOOL) generateReference:(EXPSymbolReference *)reference error:(EXPError *)error;
- (BOOL) generateUnaryOp:(EXPUnaryOp *)op error:(EXPError *)error;
- (BOOL) generateBinaryOp:(EXPBinOp *)op error:(EXPError *)error;
- (BOOL) generateTernaryOp:(EXPTernOp *)op error:(EXPError *)error;
- (BOOL) generateTablePoints:(NSArray *)points forVariable:(NSString *)name points:(int)n error:(EXPError *)error;
- (BOOL) generateTableDefinition:(EXPTableElement *)table error:(EXPError *)error;
- (BOOL) generateExpression:(EXPExpression *)expression error:(EXPError *)error;
- (BOOL) generateAssignment:(EXPAssignmentOp *)assignment error:(EXPError *)error;
- (BOOL) generateStatement:(EXPExpression *)exp error:(EXPError *)error;
- (BOOL) generateBlock:(EXPBlockElement *)block error:(EXPError *)error;

- (void) setConstantOutputMode:(id)constantOutputMode;
- (id) constantOutputMode;

- (BOOL) generateExpression:(EXPExpression *)expression error:(EXPError *)error;
- (BOOL) generate:(EXPBlockElement *)block toFile:(NSString *)filename /*solv95:(BOOL)solv95*/ error:(EXPError *)error;

@end