Skip to content

Commit 4d61e33

Browse files
committed
first version in vscode, maybe with clang (dit lijkt eerder g++)
1 parent 5fcae81 commit 4d61e33

19 files changed

+810
-624
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
mono_crash.*
1818

1919
# Build results
20+
[Bb]uild/
2021
[Dd]ebug/
2122
[Dd]ebugPublic/
2223
[Rr]elease/

.vscode/launch.json

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,51 @@
33
// Hover to view descriptions of existing attributes.
44
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
55
"version": "0.2.0",
6-
"configurations": [
6+
"configurations": [
77
{
8-
"name": "(gdb) Launch",
8+
"name": "Debug",
99
"type": "cppdbg",
1010
"request": "launch",
11-
"program": "/home/alaindef/projects/vscode/expressionparser/bin/Debug/expressionparsercb",
11+
// "program": "enter program name, for example ${workspaceFolder}/a.out",
12+
// "program": "/home/alaindef/projects/vscode/expressionparser/build/expressionparser",
13+
"program": "${workspaceFolder}/build/expressionparser",
1214
"args": [],
1315
"stopAtEntry": false,
14-
"cwd": "${fileDirname}",
16+
"cwd": "${workspaceFolder}",
1517
"environment": [],
16-
"externalConsole": false,
18+
"externalConsole": true,
1719
"MIMode": "gdb",
1820
"setupCommands": [
1921
{
2022
"description": "Enable pretty-printing for gdb",
2123
"text": "-enable-pretty-printing",
22-
"ignoreFailures": true
23-
},
24-
{
25-
"description": "Set Disassembly Flavor to Intel",
26-
"text": "-gdb-set disassembly-flavor intel",
27-
"ignoreFailures": true
24+
"ignoreFailures": false
2825
}
2926
]
30-
}
27+
},
28+
// {
29+
// "name": "(gdb) Launch",
30+
// "type": "cppdbg",
31+
// "request": "launch",
32+
// "program": "/home/alaindef/projects/vscode/expressionparser/bin/Debug/expressionparser",
33+
// "args": [],
34+
// "stopAtEntry": false,
35+
// "cwd": "${fileDirname}",
36+
// "environment": [],
37+
// "externalConsole": false,
38+
// "MIMode": "gdb",
39+
// "setupCommands": [
40+
// {
41+
// "description": "Enable pretty-printing for gdb",
42+
// "text": "-enable-pretty-printing",
43+
// "ignoreFailures": true
44+
// },
45+
// {
46+
// "description": "Set Disassembly Flavor to Intel",
47+
// "text": "-gdb-set disassembly-flavor intel",
48+
// "ignoreFailures": true
49+
// }
50+
// ]
51+
// }
3152
]
3253
}

.vscode/settings.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
{
2-
"C_Cpp.errorSquiggles": "disabled"
2+
"C_Cpp.errorSquiggles": "disabled",
3+
"files.associations": {
4+
"ostream": "cpp",
5+
"stdexcept": "cpp"
6+
}
37
}

Backus.txt

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,36 @@ var ::= letter | {letter | digit}
55
num ::= {digit} | {digit} . {digit}
66

77
// the following defines the precedence, according to https://en.wikipedia.org/wiki/Order_of_operations
8-
op2 ::= + | -
9-
op3 ::= * | /
10-
op4 ::= + | -
11-
op6 ::= < | <= | > |>=
12-
op7 ::= == | !=
13-
op13 ::= ? | :
14-
op14 ::= = |
8+
op2 ::= + | -
9+
op3 ::= * | /
10+
op4 ::= + | -
11+
op6 ::= < | <= | > |>=
12+
op7 ::= == | !=
13+
op13 ::= ? | :
14+
op14 ::= = |
15+
16+
17+
a = 1 * 2 + 3 < 4 == 5 ? 6 : 7
18+
<e3->7
19+
<--e4--->
20+
<----e6----->
21+
<-------e7------->
22+
<----------e13----------->
23+
<-----------e14-------------->
24+
1525

1626
//
17-
expr0 ::= var | num | expr1 ex:abc, 13, a2, (...)
27+
expr0 ::= var | num | expr1 ex:abc, 13, a2, (...)
1828
expr1 ::= ( expr13 )
19-
expr2 ::= expr0 | op2 expr0 ex:+abc, -4, 5
20-
expr3 ::= expr2 | expr2 op3 expr3 ex:a*4, -2*5, 2*-5, -1*(...)
21-
expr4 ::= expr3 | expr3 op4 expr4 ex:a*4 + 3, a*4 + (...)
22-
expr6 ::= expr4 | expr4 op6 expr6 ex:a*4 + 3 < 4
23-
expr7 ::= expr6 | expr6 op7 expr7 ex:a*4 + 3 < 4 != 7
24-
expr13 ::= expr7 | expr7 ? expr7 : exp7
29+
expr2 ::= expr0 | op2 expr0 ex:+abc, -4, 5
30+
expr3 ::= expr2 | expr2 op3 expr3 ex:a*4, -2*5, 2*-5, -1*(...)
31+
expr4 ::= expr3 | expr3 op4 expr4 ex:a*4 + 3, a*4 + (...)
32+
expr6 ::= expr4 | expr4 op6 expr6 ex:a*4 + 3 < 4
33+
expr7 ::= expr6 | expr6 op7 expr7 ex:a*4 + 3 < 4 != 7
34+
expr13 ::= expr7 | expr7 ? expr7 : exp7
35+
expr14 ::= var op14 expr13
36+
37+
expr ::= expr14 | expr13
2538

2639

2740

CMakeLists.txt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
cmake_minimum_required(VERSION 3.0.0)
2+
project(expressionparser VERSION 0.1.0 LANGUAGES C CXX)
3+
4+
include(CTest)
5+
enable_testing()
6+
7+
set(SOURCES
8+
main.cpp
9+
# calculator.cpp
10+
tokengenerator.cpp
11+
rpngenerator.cpp
12+
vartable.cpp)
13+
14+
set(HEADERS
15+
# calculator.h
16+
tokengenerator.h
17+
rpngenerator.h
18+
vartable.h
19+
utils.h)
20+
21+
add_executable(expressionparser ${SOURCES} ${HEADERS})
22+
23+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
24+
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
25+
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
26+
include(CPack)

calculator.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#include <iostream>
2+
#include "calculator.h"
3+
4+
Calculator::Calculator() {}
5+
6+
float Calculator::calc(std::vector<RpnGenerator::RPNToken>& tokenlist){
7+
if (tokenlist.size() == 0) return 0.f;
8+
9+
float res = 0;
10+
float v1 = 0;
11+
float v2 = 0;
12+
13+
// RpnGenerator::RPNToken last = tokenlist.back();
14+
// tokenlist.pop_back();
15+
16+
cursor--;
17+
if (cursor<0) cout << "\n\n !!! ERROR cursor !!!\n";
18+
RpnGenerator::RPNToken last = tokenlist[cursor];
19+
20+
//remember that operands will be eaten in reverse order
21+
switch (last.opcode) {
22+
case OC::NUM: res = last.value; break;
23+
case OC::VAR: res = vartab->getValue((int)last.value); break;
24+
case OC::MUL: res = calc(tokenlist) * calc(tokenlist); break;
25+
case OC::DIV: v1 = calc(tokenlist); res = calc(tokenlist)/v1; break;
26+
case OC::ADD: res = calc(tokenlist) + calc(tokenlist); break;
27+
case OC::SUB: v1 = calc(tokenlist); res = calc(tokenlist) - v1; break;
28+
case OC::PAS: res = calc(tokenlist); break;
29+
case OC::CHS: res = -calc(tokenlist); break;
30+
case OC::LT: res = calc(tokenlist) > calc(tokenlist); break;
31+
case OC::LE: res = calc(tokenlist) >= calc(tokenlist); break;
32+
case OC::GT: res = calc(tokenlist) < calc(tokenlist); break;
33+
case OC::GE: res = calc(tokenlist) <= calc(tokenlist); break;
34+
case OC::EQ: res = calc(tokenlist) == calc(tokenlist); break;
35+
case OC::NE: res = calc(tokenlist) != calc(tokenlist); break;
36+
case OC::ASS: res = calc(tokenlist);
37+
vartab->setVar(tokenlist[cursor-1].value, res); cursor--; break;
38+
case OC::COL: v1 = calc(tokenlist); v2=calc(tokenlist);
39+
res = calc(tokenlist)?v2:v1; break;
40+
default: break;
41+
}
42+
return res;
43+
}
44+
45+
void Calculator::calcandprint(std::vector<RpnGenerator::RPNToken> &tokenlist, bool prt) {
46+
cursor = tokenlist.size();
47+
float result = calc(tokenlist);
48+
if (prt){
49+
std::cout << "EVALUATION RESULT ==> " << std::to_string(result) << std::endl;
50+
vartab->printVarTable();
51+
cout << "_______________________________________________________________________________" << std::endl;
52+
}
53+
}
54+
55+

calculator.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#pragma once
2+
#ifndef CALCULATOR_H
3+
#define CALCULATOR_H
4+
#include <functional>
5+
#include "rpngenerator.h"
6+
7+
class Calculator
8+
{
9+
public:;;
10+
11+
Calculator();
12+
Calculator(VarTable *vt) : vartab(vt){}
13+
void calcandprint(std::vector<RpnGenerator::RPNToken> &tokenlist, bool prt);
14+
float calc(std::vector<RpnGenerator::RPNToken> &tokenlist);
15+
16+
private:
17+
VarTable * vartab;
18+
19+
std::vector<RpnGenerator::RPNToken> inputRPNTokenList;
20+
static float fun_elv(float x, float y, float z){
21+
if (x>0.5) return y; else return z;}
22+
int cursor;
23+
24+
};
25+
26+
27+
28+
#endif // CALCULATOR_H

defs.h

Lines changed: 3 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,7 @@
1-
#ifndef DEFS_H
2-
#define DEFS_H
1+
#pragma once
32
#include <string>
4-
#include <stdio.h>
3+
#include <vector>
54

6-
using namespace std;
7-
// PASS 1 will scan the input test and generate a list of symbols (see PASS1)
8-
// we will assign a type to each allowed character .
9-
// e.g. character 'h' (ascii 104) is a LETT, character '0' (ascii 48 )is a DIGIT. character (40) is PAR_L (left parenthesis)
10-
// the following are the possible character types:
11-
enum TokenType
12-
{ETX, LF, TAB, BLANK, HASHT, PAR_L, PAR_R, DOT, TIMES, DIV, PLUS, MINUS, LT, EQ, GT, QUEST, COLON, LETT, DIGIT, CR, OTHER, EXCLA, TEST};
13-
14-
typedef vector<TokenType> TokenTypeList;
15-
16-
//PASS 2 will scan the output of PASS1 and generate a list of tokens
17-
// precedence is according to https://en.cppreference.com/w/cpp/language/operator_precedence#cite_note-2
18-
// or https://en.wikipedia.org/wiki/Order_of_operations
19-
20-
// prettyPrint of TokenType:
21-
string ppTokenType[32] ={"ETX", "LF", "TAB", "BLANK", "HASHT", "PAR_L", "PAR_R", "DOT", "TIMES", "DIV", "PLUS", "MINUS", "LT", "EQ", "GT", "QUEST", "COLON", "LETT", "DIGIT", "CR", "OTHER", "EXCLA", "TEST"};
22-
23-
uint cursor = 0;
24-
typedef struct {
25-
TokenType type;
26-
string content;
27-
int opcode;
28-
int arity;
29-
int precedence;
30-
uint cursor;
31-
} Token;
32-
typedef vector<Token> TokenList;
335

34-
TokenType kartyp[256]; // type of each character
356

36-
string KarPP[256]; // string representation of each character
37-
38-
void initDinges(){
39-
for (int j= 1; j<256; j++) {kartyp[j] = OTHER; KarPP[j] = "OTHER";};
40-
for (int j= 48; j<58; j++) {kartyp[j] = DIGIT; KarPP[j] = "D";};
41-
for (int j= 65; j<91; j++) {kartyp[j] = LETT ; KarPP[j] = "L";};
42-
for (int j= 97; j<123; j++) {kartyp[j] = LETT; KarPP[j] = "L";};
43-
44-
kartyp[95] = LETT; KarPP[95] = "L";
45-
kartyp[0] = ETX; KarPP[0] = "ETX";
46-
kartyp[10] = LF; KarPP[10] = "LF";
47-
kartyp[11] = TAB; KarPP[11] = "TAB";
48-
kartyp[13] = CR; KarPP[13] = "CR";
49-
kartyp[32] = BLANK; KarPP[32] = "BLANK";
50-
kartyp[33] = EXCLA; KarPP[33] = "!END!";
51-
kartyp[35] = HASHT; KarPP[35] = "HASHT";
52-
kartyp[40] = PAR_L; KarPP[40] = "(";
53-
kartyp[41] = PAR_R; KarPP[41] = ")";
54-
kartyp[42] = TIMES; KarPP[42] = "*";
55-
kartyp[43] = PLUS; KarPP[43] = "+";
56-
kartyp[45] = MINUS; KarPP[45] = "-";
57-
kartyp[46] = DOT; KarPP[46] = ".";
58-
kartyp[47] = DIV; KarPP[47] = "/";
59-
kartyp[58] = COLON; KarPP[58] = ":";
60-
kartyp[60] = LT; KarPP[60] = "<";
61-
kartyp[61] = EQ; KarPP[61] = "=";
62-
kartyp[62] = GT; KarPP[62] = ">";
63-
kartyp[63] = QUEST; KarPP[63] = "?";
64-
}
65-
66-
// finally our main data structures:
67-
// 2. the output of PASS1 as a vector of symbols. it is also the input for PASS2.
68-
// symbols of type Token, the element "content" can be TODO
69-
TokenList symList;
70-
// 3. the output of PASS2 as a vector of tokens
71-
TokenList symListOut;
72-
73-
#endif // DEFS_H
7+
using namespace std;

interpreter.h

Lines changed: 0 additions & 39 deletions
This file was deleted.

0 commit comments

Comments
 (0)