• No results found

Obligatorisk uppgift: Numerisk kalkylator

N/A
N/A
Protected

Academic year: 2022

Share "Obligatorisk uppgift: Numerisk kalkylator"

Copied!
17
0
0

Loading.... (view fulltext now)

Full text

(1)

Obligatorisk uppgift: Numerisk kalkylator

Följande klasser skall ingå

I Calculator

Till stor del given. Kompletteras bara med exception- hantering.

I Stokenizer

Given - skall användas (i oförändrat skick)!

I Parser

En mall (”

ParserTemplate

”) given

I SyntaxException

I EvaluationException

(2)

Klassen Calculator

”Huvudklass” för kalkylatorn. Innehåller konstruktor,

statement

(med en hjälpmetod) samt

main

-metoden.

public class Calculator { private Parser parser;

private Stokenizer tokenizer;

private Map<String, Double> variables;

public Calculator(Stokenizer tokenizer) { this.tokenizer = tokenizer;

variables = new TreeMap<String, Double>();

variables.put("PI", Math.PI);

variables.put("E", Math.E);

variables.put("ans", new Double(0.));

parser = new Parser(tokenizer, variables);

}

(12 september 2018 – OU2 2 )

(3)

Kalylatorns main-metod

public static void main(String[] args) throws IOException

{

System.out.println("Numerical calculator version 2018-09-11");

Calculator calc = new Calculator(new Stokenizer());

while (true) { statement();

} }

(4)

Kalylatorns statement-metod

public void statement() { try {

calc.line();

} catch (SyntaxException syntaxException) { throw syntaxException;

} catch (EvaluationException evaluationException) { throw evaluationException;

} }

Röd kod

ska ersättas med kod som ger felutskrift och ser till att tokenizern positioneras till slutet på raden

(12 september 2018 – OU2 4 )

(5)

Hjälpmetod till statement

EOL EOL

file quit vars statement

assignment filename

private void line() {

do { // Skip empty lines

System.out.print("> ");

tokenizer.nextToken();

} while (tokenizer.isEOL());

String command = tokenizer.getToken(); // First token if (command.equals("quit") || tokenizer.isEOS()) {

System.out.println("Bye!");

System.exit(0);

} else if (command.equals("vars")) { System.out.println(variables);

tokenizer.nextToken();

} else {

double parsed = parser.assignment();

System.out.println(parsed);

variables.put("ans", new Double(parsed));

}

if (!tokenizer.isEOL()) {

throw new SyntaxException("Expected EOL");

}

(6)

Syntaxdiagram: Specifikation för Parser-klassen

Obs: Hette tidigare factor

eller

eller

number

) expression

= word

function name

term

+

expression

* term

factor /

primary

function name

word

sin cos exp log

( assignment

primary

primary

assignment

factor

(12 september 2018 – OU2 6 )

(7)

Parser-mallen

public class ParserTemplate { private Stokenizer tokenizer;

private Map<String, Double> variables;

private TreeSet<String> functions;

public ParserTemplate(Stokenizer tokenizer,

Map<String,Double> variables) {

this.tokenizer = tokenizer;

this.variables = variables;

functions = new TreeSet<String>();

functions.add("sin");

functions.add("cos");

functions.add("exp");

functions.add("log");

}

(8)

Parser-mallen

public double assignment() { double result = expression();

return result;

}

public double expression() { double sum = term();

return sum;

}

public double term() { double prod = factor();

return prod;

}

public double factor() { return primary();

}

(12 september 2018 – OU2 8 )

(9)

Parser-mallen

public double primary() { double result = 99999;

if (tokenizer.isNumber()) {

result = tokenizer.getNumber();

tokenizer.nextToken();

} else {

throw new SyntaxException("primary not complete yet: " + tokenizer.getToken());

}

return result;

} }

(10)

Tips om hantering av funktionsanropen

Funktionsanropen har alla samma syntax:

funktionsnamn(assignment)

log function

name (

word

) function name

sin cos exp

primary

assignment

number

primary

(12 september 2018 – OU2 10 )

(11)

Tips om hantering av funktionsanropen

Hanteringen av argumentet (syntaxkontroll av och evaluering) bör alltså göras gemensamt på ett ställe. Inget ”klipp och klistrande” av kod, alltså!

För att underlätta det har parsern försetts med ett

TreeSet<String> functions

som innehåller funktionsnamnen.

Följande kod passar då in någonstans i

primary ...

else if (funtions.contains(tokenizer.getToken()) { result = functionHandler(tokenizer.getToken()) } else if {

...

(12)

Hjälpmetoden functionHandler

double functionHandler(String functionName) {

tokenizer.nextToken(); // Pass the function name if (tokenizer.getChar()!=’(’)

throw new SyntaxException(...);

double argument = primary(); // Handles the parentheses if (functionName.equals("exp"))

return Math.exp(argument);

else if ( ... ) ...

else if ( ... ) ...

...

}

Metoden utnyttjar alltså

primary

för kontrollen av högerparentesen.

(12 september 2018 – OU2 12 )

(13)

Var kan syntaxfel upptäckas?

eller

eller

number

) expression

= word

function name

term

+

expression

* term

factor /

primary

function name

word

sin cos

( assignment

primary

primary

assignment

factor

(14)

Var kan syntaxfel upptäckas?

eller

eller

/ expression

=

term expression

function name sin cos exp log primary term

factor (

function name

*

word

+

) word

primary

primary

assignment

number factor

assignment

(12 september 2018 – OU2 14 )

(15)

Var kan syntaxfel upptäckas?

EOL EOL

file quit

vars statement

assignment filename

(16)

Var kan syntaxfel upptäckas?

quit

file filename vars

statement

assignment EOL

EOL

(12 september 2018 – OU2 16 )

(17)

Tips

Lägg in undantagshanteringen från början!

Se till att följande skrivs ut:

I

Vilken/vilka tokar som förväntades

I

Vilken tok som hittades (

getToken()

)

I

Vilken den närmast föregående token var (

getPreviousToken()

).

Det underlättar i hög grad felsökningen i ert program!

References

Related documents

3 SVCA, Svenska riskkapitalföreningen.. bolagen tillför portföljbolagen. Något som talar för att PE-bolagen kanske inte är riktigt lika genuint värdeskapande som de själva

Laaksonen (ibid.) is with this study considered a composer in the area of private label research and his model is describing a development from private labels being low price and

The result from the empirical study conducted in Tanzania reveals that Public-Private Partnerships were quite successful to facilitate empowerment among poor people

Board dummy is a dummy variable taking the value of 1 if the lead public investor (in case of public investment) or the lead VC investor (in case the company is solely backed

The participants of this research are 44 teachers 21 from public and 23 from private , 471 students of all grad six from both private and public schools and

Sustainable Småland and Sustainable Sweden Southeast both placed emphasis on the collaboration between the three sectors of public, private and academia, where the latter was seen

Gällande tidigare forskning inom PB-ämnet är den överlag relativt begränsad då vi främst finner information om behavioristiska teorier applicerade på rådgivning

In fact, the industry response to the COVID-19 crisis has been overwhelming with numerous initiatives, with over 250 public-private data collaboratives worldwide to improve