1/*
2 * Copyright 2013-2014, Rene Gollent, rene@gollent.com.
3 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
4 * Distributed under the terms of the MIT License.
5 */
6
7#include "CLanguageFamily.h"
8
9#include <new>
10
11#include <stdlib.h>
12
13#include "CLanguageExpressionEvaluator.h"
14#include "CLanguageFamilySyntaxHighlighter.h"
15#include "CLanguageTokenizer.h"
16#include "ExpressionInfo.h"
17#include "TeamTypeInformation.h"
18#include "StringValue.h"
19#include "Type.h"
20#include "TypeLookupConstraints.h"
21
22
23using CLanguage::ParseException;
24
25
26CLanguageFamily::CLanguageFamily()
27{
28}
29
30
31CLanguageFamily::~CLanguageFamily()
32{
33}
34
35
36SyntaxHighlighter*
37CLanguageFamily::GetSyntaxHighlighter() const
38{
39	return new(std::nothrow) CLanguageFamilySyntaxHighlighter();
40}
41
42
43status_t
44CLanguageFamily::EvaluateExpression(const BString& expression,
45	ValueNodeManager* manager, TeamTypeInformation* info,
46	ExpressionResult*& _output, ValueNode*& _neededNode)
47{
48	_output = NULL;
49	_neededNode = NULL;
50	CLanguageExpressionEvaluator evaluator;
51	try {
52		_output = evaluator.Evaluate(expression, manager, info);
53		return B_OK;
54	} catch (ParseException& ex) {
55		BString error;
56		error.SetToFormat("Parse error at position %" B_PRId32 ": %s",
57			ex.position, ex.message.String());
58		StringValue* value = new(std::nothrow) StringValue(error.String());
59		if (value == NULL)
60			return B_NO_MEMORY;
61		BReference<Value> valueReference(value, true);
62		_output = new(std::nothrow) ExpressionResult();
63		if (_output == NULL)
64			return B_NO_MEMORY;
65		_output->SetToPrimitive(value);
66		return B_BAD_DATA;
67	} catch (ValueNeededException& ex) {
68		_neededNode = ex.value;
69	}
70
71	return B_OK;
72}
73