Skip to content

Commit c4085f7

Browse files
author
robertDurst
committed
add list type and list
1 parent 4f569cb commit c4085f7

File tree

9 files changed

+61
-5
lines changed

9 files changed

+61
-5
lines changed

examples/test2.fish

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import foo : "foo.fish"
22
import bar : "bar.fish"
33

4-
(fun some_function(int i)(void){
4+
(fun some_function([int] i)(void){
55
i = i + 1
66
return i
77
})
88

99
start {
10+
dec str s = "Throw youresel"
11+
dec [int] i = [1,2,3]
1012
f.f = f...foo() + (5 * 11 ** (4 and 6))
1113
z = 7
1214

src/lexar/Lexar2.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,8 @@ Lexar2::getNextToken()
156156
case '|':
157157
return makeToken(TokenKind::PIPE, buffer);
158158
case ';':
159-
case '[':
160-
case ']':
161159
return makeToken(TokenKind::ERROR,
162-
"No semi-colons or brackets in Sailfish.");
160+
"No semi-colons in Sailfish.");
163161

164162
// multiple states for completion
165163
case '+':
@@ -195,6 +193,9 @@ Lexar2::getNextToken()
195193
case '.':
196194
state = State::DOUBLE_DOT;
197195
break;
196+
case '[':
197+
state = State::LIST;
198+
break;
198199
default:
199200
return makeToken(TokenKind::ERROR,
200201
"Unrecognized character.");
@@ -290,6 +291,18 @@ Lexar2::getNextToken()
290291
return c == '.' ? makeToken(TokenKind::TRIPLE_DOT, buffer)
291292
: makeToken(TokenKind::ERROR, "Expected a dot.");
292293

294+
case State::LIST:
295+
if (c == ']')
296+
{
297+
if (buffer == "[int]" || buffer == "[bool]" ||
298+
buffer == "[str]" || buffer == "[flt]")
299+
return makeToken(TokenKind::LISTTYPE, buffer);
300+
301+
else
302+
return makeToken(TokenKind::LIST, buffer);
303+
}
304+
break;
305+
293306
default:
294307
return makeToken(TokenKind::ERROR, "Unexpected state.");
295308
}

src/lexar/Lexar2.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class Lexar2
3939
DOUBLE_DOT,
4040
TRIPLE_DOT,
4141
COMMENT,
42+
LIST,
4243
ERROR
4344
};
4445

src/lexar/Token2.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ displayKind(const TokenKind& k)
3535
return "BOOL";
3636
case TokenKind::STRING:
3737
return "STRING";
38+
case TokenKind::LIST:
39+
return "LIST";
3840
case TokenKind::MODULO:
3941
return "MODULO";
4042
case TokenKind::ADDITION:
@@ -101,6 +103,8 @@ displayKind(const TokenKind& k)
101103
return "PIPE";
102104
case TokenKind::COLON:
103105
return "COLON";
106+
case TokenKind::LISTTYPE:
107+
return "LISTTYPE";
104108
case TokenKind::ERROR:
105109
return "ERROR";
106110
case TokenKind::EOF_:

src/lexar/Token2.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ enum class TokenKind
2727
FLOAT,
2828
BOOL,
2929
STRING,
30+
LIST,
3031

3132
// Compairsons, Arithmetic, etc.
3233
MODULO,
@@ -70,6 +71,7 @@ enum class TokenKind
7071
COLON,
7172

7273
// Else
74+
LISTTYPE,
7375
ERROR,
7476
EOF_,
7577
};

src/parser/Lexeme.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ disp(LIT o)
143143
return "Integer";
144144
case LIT::FLOAT:
145145
return "Float";
146+
case LIT::LIST:
147+
return "List";
148+
case LIT::LISTTYPE:
149+
return "List type";
146150
default:
147151
return "Unknown";
148152
}

src/parser/Lexeme.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ enum class LIT
7676
BOOLEAN,
7777
INTEGER,
7878
FLOAT,
79+
LIST,
80+
LISTTYPE,
7981
};
8082
std::string disp(LIT l);
8183

src/parser/Parser2.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -827,11 +827,13 @@ Parser2::parsePrimary()
827827
return parseString();
828828
case TokenKind::IDENTIFIER:
829829
return parseIdentifier();
830+
case TokenKind::LIST:
831+
return parseList();
830832
default:
831833
errorhandler->handle(
832834
new Error2(currentToken->col, currentToken->line,
833835
"Expected a valid primary token such as a boolean, "
834-
"integer, float, string, or identifier.",
836+
"integer, float, string, identifier, or list.",
835837
"Received: ", currentToken->value,
836838
" of type " + displayKind(currentToken->kind) + "."));
837839
return parseIdentifier(); // unreachable
@@ -844,6 +846,8 @@ Parser2::parsePrimary()
844846
std::shared_ptr<LeafLexeme>
845847
Parser2::parseType()
846848
{
849+
if (currentToken->kind == TokenKind::LISTTYPE)
850+
return parseListType();
847851
return parseIdentifier();
848852
}
849853

@@ -914,3 +918,25 @@ Parser2::parseString()
914918
advanceAndCheckToken(TokenKind::STRING); // eat string
915919
return makeLeaf(LIT::STRING, v);
916920
}
921+
922+
/**
923+
* List := lexvalue
924+
*/
925+
std::shared_ptr<LeafLexeme>
926+
Parser2::parseList()
927+
{
928+
auto v = currentToken->value;
929+
advanceAndCheckToken(TokenKind::LIST); // eat list
930+
return makeLeaf(LIT::LIST, v);
931+
}
932+
933+
/**
934+
* ListType := lexvalue
935+
*/
936+
std::shared_ptr<LeafLexeme>
937+
Parser2::parseListType()
938+
{
939+
auto v = currentToken->value;
940+
advanceAndCheckToken(TokenKind::LISTTYPE); // eat list type
941+
return makeLeaf(LIT::LISTTYPE, v);
942+
}

src/parser/Parser2.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ class Parser2
110110
std::shared_ptr<LeafLexeme> parseFloat();
111111
std::shared_ptr<LeafLexeme> parseString();
112112
std::shared_ptr<LeafLexeme> parseIdentifier();
113+
std::shared_ptr<LeafLexeme> parseList();
114+
std::shared_ptr<LeafLexeme> parseListType();
113115

114116
public:
115117
Parser2(const std::string& filename);

0 commit comments

Comments
 (0)