1247606Spjd/*
2247606Spjd * Copyright 2013-2014, Rene Gollent, rene@gollent.com.
3247606Spjd * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
4247606Spjd * Distributed under the terms of the MIT License.
5247606Spjd */
6247606Spjd
7247606Spjd#include "CLanguageFamily.h"
8247606Spjd
9247606Spjd#include <new>
10247606Spjd
11247606Spjd#include <stdlib.h>
12247606Spjd
13247606Spjd#include "CLanguageExpressionEvaluator.h"
14247606Spjd#include "CLanguageFamilySyntaxHighlighter.h"
15247606Spjd#include "CLanguageTokenizer.h"
16247606Spjd#include "ExpressionInfo.h"
17247606Spjd#include "TeamTypeInformation.h"
18247606Spjd#include "StringValue.h"
19247606Spjd#include "Type.h"
20247606Spjd#include "TypeLookupConstraints.h"
21247606Spjd
22247606Spjd
23247606Spjdusing CLanguage::ParseException;
24247606Spjd
25247606Spjd
26247606SpjdCLanguageFamily::CLanguageFamily()
27247606Spjd{
28247606Spjd}
29247606Spjd
30247606Spjd
31247606SpjdCLanguageFamily::~CLanguageFamily()
32247606Spjd{
33247606Spjd}
34263234Srwatson
35247606Spjd
36247606SpjdSyntaxHighlighter*
37247606SpjdCLanguageFamily::GetSyntaxHighlighter() const
38247606Spjd{
39247606Spjd	return new(std::nothrow) CLanguageFamilySyntaxHighlighter();
40247606Spjd}
41247606Spjd
42247606Spjd
43247606Spjdstatus_t
44247606SpjdCLanguageFamily::EvaluateExpression(const BString& expression,
45247606Spjd	ValueNodeManager* manager, TeamTypeInformation* info,
46247606Spjd	ExpressionResult*& _output, ValueNode*& _neededNode)
47247606Spjd{
48247606Spjd	_output = NULL;
49247606Spjd	_neededNode = NULL;
50247606Spjd	CLanguageExpressionEvaluator evaluator;
51247606Spjd	try {
52247606Spjd		_output = evaluator.Evaluate(expression, manager, info);
53247606Spjd		return B_OK;
54247676Spjd	} catch (ParseException& ex) {
55247606Spjd		BString error;
56247606Spjd		error.SetToFormat("Parse error at position %" B_PRId32 ": %s",
57247606Spjd			ex.position, ex.message.String());
58247606Spjd		StringValue* value = new(std::nothrow) StringValue(error.String());
59247606Spjd		if (value == NULL)
60247606Spjd			return B_NO_MEMORY;
61247606Spjd		BReference<Value> valueReference(value, true);
62247606Spjd		_output = new(std::nothrow) ExpressionResult();
63247606Spjd		if (_output == NULL)
64247606Spjd			return B_NO_MEMORY;
65247606Spjd		_output->SetToPrimitive(value);
66247606Spjd		return B_BAD_DATA;
67247606Spjd	} catch (ValueNeededException& ex) {
68247606Spjd		_neededNode = ex.value;
69247606Spjd	}
70247606Spjd
71247606Spjd	return B_OK;
72247606Spjd}
73247606Spjd