Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added support for compiler behaviour modifying pragma comments #595

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,6 @@
"BufferEncoding": true
},
"ignorePatterns": [
"parser/antlr/*.ts"
"lexer-parser/antlr/*.ts"
]
}
2 changes: 1 addition & 1 deletion .nycrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
],
"extension": ["ts"],
"exclude": [
"**/parser/antlr/*.*",
"**/lexer-parser/antlr/*.*",
"**/*.test.ts",
"**/*.spec.ts",
"**/*.d.ts",
Expand Down
8 changes: 4 additions & 4 deletions .run/kipper run.run.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="kipper run" type="NodeJSConfigurationType" application-parameters="run -s &quot;&quot;" path-to-js-file="./kipper/cli/bin/run" working-dir="$PROJECT_DIR$/">
<method v="2" />
</configuration>
</component>
<configuration default="false" name="kipper run" type="NodeJSConfigurationType" application-parameters="run ./test.kip" path-to-js-file="./kipper/cli/bin/run" working-dir="$PROJECT_DIR$/">
<method v="2" />
</configuration>
</component>
22 changes: 18 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ To use development versions of Kipper download the
[`next` tag release](https://www.npmjs.com/package/kipper?activeTab=versions), which will include the specified changes.

### Added

- Implemented Processing for File Scoped Pragmas ([#480](https://github.com/Kipper-Lang/Kipper/issues/480))
- Implemented Bitwise Operations (`&`, `|`, `^`, `~`, `<<`, `>>`, `>>>`).
([#493](https://github.com/Kipper-Lang/Kipper/issues/493))
- Implemented Conditional Expression (`COND ? EXP : EXP`) as a ternary operator.
Expand Down Expand Up @@ -60,6 +60,7 @@ To use development versions of Kipper download the
- `BitwiseOrExpression`, which represents an AST bitwise OR expression.
- `BitwiseXorExpression`, which represents an AST bitwise XOR expression.
- `BitwiseShiftExpression`, which represents an AST bitwise shift expression.
- `PragmaProcessor` which handles the processing of all possible Pragmas.
- New interfaces:
- `PrimaryExpressionSemantics`, which represents the semantics of a primary expression.
- `PrimaryExpressionTypeSemantics`, which represents the type semantics of a primary expression.
Expand Down Expand Up @@ -98,10 +99,17 @@ To use development versions of Kipper download the
- `ignoreParams` in `createJSFunctionSignature()`, which, if true makes the function signature define no parameters.
- `ignoreParams` in `genTSFunction()`, which, if true makes the function signature define no parameters.
- `ignoreParams` in `createTSFunctionSignature()`, which, if true makes the function signature define no parameters.
- New field:
- New constants:
- `DEFAULT_TOKEN_CHANNEL`, which is the channel id of the default channel storing all the parser-relevant tokens that
the Lexer lexed.
- `HIDDEN`, which is the channel id of the channel storing all whitespaces and newlines that the Lexer lexed.
- `COMMENT`, which is the channel id of the channel storing all the comments that the Lexer lexed.
- `PRAGMA`, which is the channel id of the channel storing all pragma comments that the Lexer lexed.
- New fields:
- `KipperError.programCtx`, which contains, if `KipperError.tracebackData.errorNode` is not undefined, the program
context of the error.
- `ParserASTNode.ruleName`, which contains the rule name of the node.
- `LexerParserData.channels`, which stores the channels generated by the Lexer.
- New types:
- `InverseMap`, which inverts a map by swapping the keys and values.
- New functions:
Expand All @@ -114,6 +122,7 @@ To use development versions of Kipper download the
- `loadAutoConfig()` in `@kipper/cli`, which loads a config file from the current working directory.
- `copyConfigResources()` in `@kipper/cli`, which copies the resources from the config file to the output directory.
- `KipperTypeChecker.validConditionalExpression()`, which ensures that a conditional expression is valid.
- `PragmaProcessor.processSingleLine()`, which changes the compiler options according to the pragmas found in the file.

### Changed

Expand All @@ -124,8 +133,11 @@ To use development versions of Kipper download the
This means it's AST kind number is now also added to the `ASTConstantExpressionKind` type and its context class is
also part of the `ParserConstantExpressionContext` type.
- Renamed:
- Module `compiler/parser` to `lexer-parser`.
- File `kipper/core/compiler/parser/parser-ast-mapping.ts` to `parse-rule-kind-mappings.ts`.
- Class `KipperParseStream` to `KipperFileStream` including its file to `file-stream.ts`.
- CLI Class `KipperParseFile` to `KipperInputFile` including its file to `input-file.ts`.
- Class `FunctionCallPostfixTypeSemantics` to `FunctionCallExpressionTypeSemantics`.
- Field `FStringPrimaryExpressionSemantics.items` to `atoms`.
- Function `getTSFunction()` to `genTSFunction()`.
- Grammar Rule `typeSpecifier` to `typeSpecifierExpression` and its AST class `TypeSpecifier` to
`TypeSpecifierExpression`. This also includes changing the name in the `KipperTargetCodeGenerator`,
Expand All @@ -148,14 +160,16 @@ To use development versions of Kipper download the
- Grammar Rule `doWhileLoopStatement` to `doWhileLoopIterationStatement` and its AST class
`DoWhileLoopStatement` to `DoWhileLoopIterationStatement`. This also includes changing the name in the
`KipperTargetCodeGenerator`, `KipperTargetSemanticAnalyser` and `KipperTargetBuiltInGenerator` classes.
- File `kipper/core/compiler/parser/parser-ast-mapping.ts` to `parse-rule-kind-mappings.ts`.
- Class `ArrayLiteralPrimaryExpression` to `ArrayPrimaryExpression`.
- Interface `ArrayLiteralPrimaryExpressionSemantics` to `ArrayPrimaryExpressionSemantics`.
- Interface `ArrayLiteralPrimaryExpressionTypeSemantics` to `ArrayPrimaryExpressionTypeSemantics`.
- Interface `TangledPrimaryTypeSemantics` to `TangledPrimaryExpressionTypeSemantics`.
- Interface `DoWhileLoopStatementSemantics` to `DoWhileLoopIterationStatementSemantics`.
- Interface `ParseData` to `LexerParserData`.
- Method `TargetASTNodeCodeGenerator.arrayLiteralExpression` to `arrayPrimaryExpression`.
- Method `TargetASTNodeSemanticAnalyser.listPrimaryExpression` to `arrayPrimaryExpression`.
- Field `FStringPrimaryExpressionSemantics.items` to `atoms`.
- Field `LexerParserData.parseStream` to `fileStream`.
- Moved:
- `kipper/core/utils.ts` to `kipper/core/tools` and separated it into multiple files & modules.
- `kipper/core/compiler/ast/root-ast-node.ts` to the `kipper/core/compiler/ast/nodes` module.
Expand Down
4 changes: 2 additions & 2 deletions kipper/cli/src/commands/compile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
LogLevel,
} from "@kipper/core";
import { CLIEmitHandler, defaultKipperLoggerConfig } from "../logger";
import { getParseStream, getTarget, KipperEncodings, KipperParseFile, verifyEncoding } from "../input/";
import { getParseStream, getTarget, KipperEncodings, KipperInputFile, verifyEncoding } from "../input/";
import { writeCompilationResult } from "../output";
import { prettifiedErrors } from "../decorators";
import { loadAutoConfig } from "../config-loader";
Expand Down Expand Up @@ -123,7 +123,7 @@ export default class Compile extends Command {

// Output
const encoding = flags["encoding"] || "utf-8";
const fileName = stream instanceof KipperParseFile ? stream.path.name : stream.name;
const fileName = stream instanceof KipperInputFile ? stream.path.name : stream.name;
const outPath = `${path.resolve(outDir)}/${fileName}.${target.fileExtension}`;

return {
Expand Down
2 changes: 1 addition & 1 deletion kipper/cli/src/input/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
* @since 0.10.3
*/
export * from "./target";
export * from "./file-stream";
export * from "./input-file";
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/
import { constants, promises as fs } from "fs";
import * as path from "path";
import { KipperParseStream } from "@kipper/core";
import { KipperFileStream } from "@kipper/core";
import { KipperFileAccessError, KipperInvalidInputError, KipperUnsupportedEncodingError } from "../errors";
import type { OutputArgs, OutputFlags } from "@oclif/parser/lib/parse";
import type { EvaluatedKipperConfigFile } from "@kipper/config";
Expand Down Expand Up @@ -56,15 +56,15 @@
args: OutputArgs,
flags: OutputFlags<any>,
config: EvaluatedKipperConfigFile | undefined,
): Promise<{ stream: KipperParseFile | KipperParseStream; outDir: string }> {
let stream: KipperParseFile | KipperParseStream;
): Promise<{ stream: KipperInputFile | KipperFileStream; outDir: string }> {
let stream: KipperInputFile | KipperFileStream;
if (args.file) {
stream = await KipperParseFile.fromFile(args.file, flags["encoding"] as KipperEncoding);
stream = await KipperInputFile.fromFile(args.file, flags["encoding"] as KipperEncoding);
} else if (flags["string-code"]) {
stream = new KipperParseStream({ stringContent: flags["string-code"] });
stream = new KipperFileStream({ stringContent: flags["string-code"] });
} else if (config?.files) {
ensureCompatibleFiles(config.files);
stream = await KipperParseFile.fromFile(config.files[0].src, flags["encoding"]);
stream = await KipperInputFile.fromFile(config.files[0].src, flags["encoding"]);

Check warning on line 67 in kipper/cli/src/input/input-file.ts

View check run for this annotation

Codecov / codecov/patch

kipper/cli/src/input/input-file.ts#L67

Added line #L67 was not covered by tests
} else {
throw new KipperInvalidInputError("Argument 'file' or flag '-s/--string-code' must be populated");
}
Expand All @@ -76,12 +76,12 @@
}

/**
* ParserFile class that is used to represent a class that may be given to the
* compiler to be parsed. This file is a simple wrapper around a file-read and
* storing as a string in 'stringContent'.
* Input file which represents a file that can be provided as an argument to the
* {@link KipperCompiler}. This file implements a file stream, which stores the
* content of the file.
* @since 0.0.2
*/
export class KipperParseFile extends KipperParseStream {
export class KipperInputFile extends KipperFileStream {
public static SPECIAL_CHARACTER_REPLACE_REGEX =
/[\x00-\x09\x0B-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g;
private readonly _absolutePath: string;
Expand Down Expand Up @@ -126,13 +126,13 @@
}

/**
* Creates a new {@link KipperParseFile} instance based on the content of the {@link filePath}
* Creates a new {@link KipperInputFile} instance based on the content of the {@link filePath}
* @param filePath The path to the file that should be read
* @param encoding The encoding that should be used to read the file
* @returns The new {@link KipperParseFile} instance with the set values
* @returns The new {@link KipperInputFile} instance with the set values
* @since 0.1.0
*/
public static async fromFile(filePath: string, encoding: KipperEncoding = "utf8"): Promise<KipperParseFile> {
public static async fromFile(filePath: string, encoding: KipperEncoding = "utf8"): Promise<KipperInputFile> {
const fileLocation = path.resolve(filePath);
const name = (() => {
const items1 = fileLocation.split("\\");
Expand All @@ -154,8 +154,8 @@
content = content.replace(/(\r(\n)?)/gi, "\n");

// Remove non-printable unicode characters
content = content.replace(KipperParseFile.SPECIAL_CHARACTER_REPLACE_REGEX, "");
content = content.replace(KipperInputFile.SPECIAL_CHARACTER_REPLACE_REGEX, "");

return new KipperParseFile(content, fileLocation, name, encoding as BufferEncoding);
return new KipperInputFile(content, fileLocation, name, encoding as BufferEncoding);
}
}
15 changes: 13 additions & 2 deletions kipper/core/KipperLexer.g4
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
lexer grammar KipperLexer;

channels {
COMMENT // Channel for all types of comments
COMMENT, // Channel for all types of comments
PRAGMA
}

tokens {
Expand All @@ -26,10 +27,15 @@ BlockComment
;

LineComment
: '//' ~[\r\n\u2028\u2029]*
: '//' CommentContent
-> channel(COMMENT)
;

Pragma
: '#pragma' CommentContent
-> channel(PRAGMA)
;

// const / var
Const : 'const';
Var : 'var';
Expand Down Expand Up @@ -369,3 +375,8 @@ DoubleQuoteSChar
: ~["\\\r\n]
| EscapeSequence
;

fragment
CommentContent
: ~[\r\n\u2028\u2029]*
;
Loading
Loading