Skip to content

Commit 4dc5cc7

Browse files
committed
update - improve extern
1 parent 818e9d6 commit 4dc5cc7

File tree

7 files changed

+45
-19
lines changed

7 files changed

+45
-19
lines changed

src/phase/generator/generation/generator.ts

-4
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,6 @@ export class Generator {
6767
this.setTemp("");
6868
return temp;
6969
}
70-
71-
pushExtendedFunction(name: string, type: AstType): void {
72-
this.extendedFunctions[name] = type;
73-
}
7470

7571
pushFunction(func: string): void {
7672
this.functions.push(func);

src/phase/parser/parse/extern.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,11 @@ import { TokenKeywordType, TokenOperatorType } from '../../lexer/tokenizer/type'
1111

1212
export function parserParseExtern(parser: Parser, parent_block: AstBlock): AstExtern | undefined {
1313
parser.expect(TokenKeywordType.TOKEN_EXTERN);
14-
console.log("===> extern");
1514
let is_function: boolean = false;
1615
if (parser.skip(TokenKeywordType.TOKEN_FN)) {
1716
is_function = true;
1817
}
19-
console.log(parser.currentToken.isKeyword, parser.currentToken.isDefinedIdentifier);
18+
2019
// if (parser.currentToken.isKeyword) {
2120
// parser.pushError(parserMessageRenderer(parser.getLanguageId(), ParserMessageKeys.PARSER_FUNCTION_NAME_IS_NOT_VALID_IDENTIFIER));
2221
// return undefined;
@@ -28,8 +27,6 @@ export function parserParseExtern(parser: Parser, parent_block: AstBlock): AstEx
2827
// return undefined;
2928
// }
3029

31-
console.log("is function:", is_function);
32-
3330
let return_type: AstType | undefined = undefined;
3431
if (is_function === false) {
3532
return_type = parseType(parser);
@@ -39,15 +36,15 @@ export function parserParseExtern(parser: Parser, parent_block: AstBlock): AstEx
3936
}
4037
}
4138

39+
// Eating function name
4240
const name: string | undefined = parser.currentToken.data?.getValueString();
43-
console.log("extern name:", name);
4441
if (name === undefined) {
4542
parser.pushError(parserMessageRenderer(parser.getLanguageId(), ParserMessageKeys.PARSER_FUNCTION_NAME_IS_NOT_VALID));
4643
return undefined;
4744
}
48-
// Eating function name
4945
parser.next();
5046

47+
// Parameters for function externs
5148
let params: AstFunctionArgument[] | undefined = undefined;
5249
if (is_function === true) {
5350
params = parserParseFunctionArguments(parser);
@@ -75,6 +72,11 @@ export function parserParseExtern(parser: Parser, parent_block: AstBlock): AstEx
7572
}
7673
parser.expect(TokenKeywordType.TOKEN_IDENTIFIER);
7774

75+
if (return_type === undefined) {
76+
parser.pushError("Invalid data type as return type of extern");
77+
return undefined;
78+
}
79+
7880
const ast: AstExtern = new AstExtern(name, params, return_type, generate_name);
7981
return ast;
8082
};

src/phase/validator/validation/extern.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,10 @@ export function validateExtern(validator: Validator, parent_block: AstBlock, ext
2727
let generated_name: string = extern.generate_name;
2828

2929
if (extern.args === undefined) {
30+
console.log("extern var " + extern.name);
3031
parent_block.symbol_table.addSymbol(extern.name, extern.return_type);
3132
} else {
3233
const extern_type: AstType = AstType.createFunction(extern.name, generated_name, extern.args, extern.return_type);
3334
parent_block.symbol_table.addSymbol(extern.name, extern_type);
3435
}
35-
36-
// console.log("Extern:", extern.generate_name)
37-
// console.log(extern_type.stringify())
38-
// console.log(extern.args);
3936
};

src/phase/validator/validation/function/function_call.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ export function validateExpressionFunctionCall(validator: Validator, block: AstB
3636

3737
// if (node.generated_value !== undefined && node.left.value_type !== undefined && node.left.value_type.is_system) {
3838
if (node.generated_value !== undefined && node.left.value_type !== undefined) {
39-
// console.log("is function", node.generated_value, node);
40-
validator.pushExtendedFunction(node.generated_value, node.left.value_type);
39+
// TODO: EXTERN
40+
// validator.pushExtendedFunction(node.generated_value, node.left.value_type);
4141

4242
const func_args: AstFunctionArgument[] = node.left.value_type.func_args;
4343
const user_func_args: AstFunctionParameter[] = node.parameters;

src/test.c

+1-3
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,13 @@
77
#include <time.h>
88
#include <ctype.h>
99

10-
// Extended functions
11-
extern char* int2str(int c);
12-
1310
// Sign functions
1411
char* test();
1512
char* main();
1613

1714
// Functions
1815
char* test() {
16+
printf("%d", age);
1917
return ("");
2018
}
2119

src/test.json

+32
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,38 @@
66
"args": [],
77
"body": {
88
"children": [
9+
{
10+
"type": "Print",
11+
"value": {
12+
"type": "ExpressionVariable",
13+
"value_type": {
14+
"type": "Type",
15+
"is_system": false,
16+
"is_primitive": false,
17+
"type_kind": "int",
18+
"is_pointer": false,
19+
"is_reference": false,
20+
"is_array": false,
21+
"members": [],
22+
"func_args": []
23+
},
24+
"left": {
25+
"type": "ExpressionLiteral",
26+
"value_type": {
27+
"type": "Type",
28+
"is_system": false,
29+
"is_primitive": false,
30+
"type_kind": "identifier",
31+
"is_pointer": false,
32+
"is_reference": false,
33+
"is_array": false,
34+
"members": [],
35+
"func_args": []
36+
},
37+
"value": "age"
38+
}
39+
}
40+
},
941
{
1042
"type": "Return",
1143
"value": {

src/test.salam

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ extern int age : age
66
// end
77

88
fn test -> string:
9+
print age
910
// string g = 33
1011
// string a = "Hey "
1112
// print int2str(412)

0 commit comments

Comments
 (0)