Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
Abgabe4Java
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Dominic Daniel Krämer
Abgabe4Java
Commits
2312f0ef
Commit
2312f0ef
authored
2 years ago
by
Dominic Daniel Krämer
Browse files
Options
Downloads
Patches
Plain Diff
parser can finally treat the brackets correctly
parent
688f3f25
No related branches found
No related tags found
1 merge request
!9
Dominicsbranch
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/Parser.java
+78
-47
78 additions, 47 deletions
src/Parser.java
with
78 additions
and
47 deletions
src/Parser.java
+
78
−
47
View file @
2312f0ef
...
...
@@ -4,36 +4,42 @@ import java.util.List;
public
class
Parser
{
private
abstract
class
Expression
{
boolean
capsuled
;
public
Expression
(
boolean
capsuled
)
{
this
.
capsuled
=
capsuled
;
}
}
private
class
BinaryOperation
extends
Expression
{
Expression
leftExpression
;
String
operator
;
Expression
rightExpression
;
B
oolean
caps
e
led
;
public
BinaryOperation
(
Expression
leftExpression
,
String
operator
,
Expression
rightExpression
,
Boolean
caps
e
led
)
{
public
BinaryOperation
(
Expression
leftExpression
,
String
operator
,
Expression
rightExpression
,
b
oolean
caps
u
led
)
{
super
(
caps
u
led
)
;
this
.
leftExpression
=
leftExpression
;
this
.
operator
=
operator
;
this
.
rightExpression
=
rightExpression
;
this
.
capseled
=
capseled
;
}
}
private
class
Variable
extends
Expression
{
String
variableName
;
public
Variable
(
String
i
)
{
public
Variable
(
String
i
,
Boolean
capsuled
)
{
super
(
capsuled
);
this
.
variableName
=
i
;
}
}
private
abstract
class
Value
extends
Expression
{
public
Value
(
boolean
capsuled
)
{
super
(
capsuled
);
}
}
private
class
Number
extends
Value
{
public
String
digits
;
public
Number
(
String
i
)
{
public
Number
(
String
i
,
boolean
capsuled
)
{
super
(
capsuled
);
this
.
digits
=
i
;
}
}
...
...
@@ -42,7 +48,8 @@ public class Parser {
public
Number
beforeDot
;
public
Number
afterDot
;
public
Decimal
(
Number
i1
,
Number
i2
)
{
public
Decimal
(
Number
i1
,
Number
i2
,
boolean
capsuled
)
{
super
(
capsuled
);
this
.
beforeDot
=
i1
;
this
.
afterDot
=
i2
;
}
...
...
@@ -59,7 +66,7 @@ public class Parser {
Expression
ast
=
parseExpression
(
ts
);
if
(!
ts
.
isEmpty
())
{
throw
new
ParserException
(
"
Runtime
Error: "
+
ts
.
size
()
+
" token(s) left"
);
throw
new
ParserException
(
"
Syntax
Error: "
+
ts
.
size
()
+
" token(s) left"
);
}
return
ast
;
}
...
...
@@ -70,22 +77,21 @@ public class Parser {
if
(
ts
.
isEmpty
())
{
throw
new
ParserException
(
"SyntaxError: empty token list"
);
}
Expression
ast
;
ast
=
parseBinaryOperation
(
ts
);
if
(
ast
==
null
)
{
ast
=
parseVariable
(
ts
);
Expression
ast
=
parseBinaryOperation
(
ts
);
if
(
ast
==
null
)
{
ast
=
parseValue
(
ts
);
}
if
(
ast
==
null
)
{
throw
new
ParserException
(
"SyntaxError: invalid character"
);
ast
=
parseVariable
(
ts
);
if
(
ast
==
null
)
{
ast
=
parseValue
(
ts
);
}
if
(
ast
==
null
)
{
throw
new
ParserException
(
"SyntaxError: invalid character"
);
}
}
}
return
ast
;
}
//checks if a String only contains an allowed operator with parseCharacter(...)
private
B
oolean
parseOperator
(
String
operator
)
throws
ParserException
{
private
b
oolean
parseOperator
(
String
operator
)
throws
ParserException
{
if
(
operator
.
length
()>
1
)
{
throw
new
ParserException
(
"SyntaxError: invalid length for an operator: "
+
operator
);
}
...
...
@@ -95,6 +101,35 @@ public class Parser {
return
true
;
}
private
int
parseBrackets
(
List
<
Lexer
.
Token
>
ts
)
throws
ParserException
{
if
(
parseCharacter
(
ts
.
get
(
0
).
getData
(),
"("
))
{
int
index
;
int
lBrackets
=
0
;
int
rBrackets
=
0
;
boolean
found
=
false
;
for
(
index
=
1
;
index
<
ts
.
size
();
index
++)
{
if
(
parseCharacter
(
ts
.
get
(
index
).
getData
(),
"("
))
{
lBrackets
+=
1
;
}
else
if
(
parseCharacter
(
ts
.
get
(
index
).
getData
(),
")"
))
{
rBrackets
+=
1
;
if
(
rBrackets
>
lBrackets
)
{
found
=
true
;
break
;
}
}
}
if
(!
found
)
{
throw
new
ParserException
(
"SyntaxError: brackets never got closed"
);
}
if
(
index
==
1
)
{
throw
new
ParserException
(
"SyntaxError: no value inside brackets"
);
}
return
index
;
}
return
-
1
;
}
private
BinaryOperation
parseBinaryOperation
(
List
<
Lexer
.
Token
>
ts
)
throws
ParserException
{
if
(
ts
.
isEmpty
())
{
throw
new
ParserException
(
"SyntaxError: empty token list"
);
...
...
@@ -102,26 +137,32 @@ public class Parser {
if
(
ts
.
size
()==
1
)
{
return
null
;
}
int
index
;
for
(
index
=
0
;
index
<
ts
.
size
();
index
++)
{
if
(
ts
.
get
(
index
).
getType
()==
Lexer
.
TokenType
.
SPECIAL
)
{
if
(!
parseCharacter
(
ts
.
get
(
index
).
getData
(),
"."
))
{
break
;
}
}
int
index
=
0
;
int
tokensInBracket
=
parseBrackets
(
ts
);
boolean
capsuled
;
if
(
tokensInBracket
+
1
==
ts
.
size
())
{
ts
.
remove
(
tokensInBracket
);
ts
.
remove
(
0
);
capsuled
=
true
;
index
=
1
;
}
if
(
index
==
ts
.
size
())
{
return
null
;
else
if
(
tokensInBracket
==-
1
)
{
capsuled
=
false
;
parseOperator
(
ts
.
get
(
1
).
getData
());
index
=
1
;
}
else
{
capsuled
=
false
;
index
=
tokensInBracket
+
1
;
}
List
<
Lexer
.
Token
>
leftList
=
new
LinkedList
<>();
for
(
int
i
=
0
;
i
<
index
;
i
++)
{
for
(
int
i
terator
=
0
;
iterator
<
index
;
i
terator
++)
{
leftList
.
add
(
ts
.
remove
(
0
));
}
Expression
leftExpression
=
parseExpression
(
leftList
);
String
operator
=
ts
.
remove
(
0
).
getData
();
parseOperator
(
operator
);
Expression
rightExpression
=
parseExpression
(
ts
);
return
new
BinaryOperation
(
leftExpression
,
operator
,
rightExpression
,
false
);
return
new
BinaryOperation
(
leftExpression
,
operator
,
rightExpression
,
capsuled
);
}
private
Variable
parseVariable
(
List
<
Lexer
.
Token
>
ts
)
throws
ParserException
{
...
...
@@ -140,7 +181,7 @@ public class Parser {
if
(!
parseCharacter
(
data
,
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
))
{
throw
new
ParserException
(
"Invalid variable character: "
+
data
);
}
return
new
Variable
(
data
);
return
new
Variable
(
data
,
false
);
}
//called by method parseException(...)
...
...
@@ -187,7 +228,7 @@ public class Parser {
ts
.
remove
(
0
);
data
=
ts
.
remove
(
0
).
getData
();
Number
afterDot
=
(
Number
)
parseNumber
(
data
);
return
new
Decimal
(
beforeDot
,
afterDot
);
return
new
Decimal
(
beforeDot
,
afterDot
,
false
);
}
//called by method parseValue(...)
...
...
@@ -198,12 +239,12 @@ public class Parser {
}
if
(
data
.
startsWith
(
"0"
)
&&
data
.
length
()
==
1
)
{
return
new
Number
(
data
);
return
new
Number
(
data
,
false
);
}
parseDigitWithoutZero
(
data
.
substring
(
0
,
1
));
parseDigit
(
data
.
substring
(
1
));
return
new
Number
(
data
);
return
new
Number
(
data
,
false
);
}
//called by method parseNumber(...)
...
...
@@ -228,7 +269,7 @@ public class Parser {
}
}
private
B
oolean
parseComma
(
List
<
Lexer
.
Token
>
ts
)
throws
ParserException
{
private
b
oolean
parseComma
(
List
<
Lexer
.
Token
>
ts
)
throws
ParserException
{
String
data
=
ts
.
get
(
1
).
getData
();
if
(
parseCharacter
(
data
,
"."
))
{
if
(
ts
.
get
(
2
).
getType
()!=
Lexer
.
TokenType
.
NUMBER
)
{
...
...
@@ -239,19 +280,9 @@ public class Parser {
return
false
;
}
private
Boolean
parseBracket
(
List
<
Lexer
.
Token
>
ts
)
throws
ParserException
{
String
data
=
ts
.
get
(
0
).
getData
();
if
(
parseCharacter
(
data
,
"("
))
{
return
true
;
}
else
{
return
false
;
}
}
//called by methods parseOperator(...), parseDigit(...), parseDigitWithoutZero(...)
//checks if a certain string can be found in a string of allowed character
private
B
oolean
parseCharacter
(
String
data
,
String
allowedCharacters
)
throws
ParserException
{
private
b
oolean
parseCharacter
(
String
data
,
String
allowedCharacters
)
throws
ParserException
{
if
(
data
.
isEmpty
())
{
throw
new
ParserException
(
"RuntimeError: empty String"
);
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment