mirror of
https://github.com/pdemian/human2regex.git
synced 2025-05-16 12:30:09 -07:00
Last push before I break something (maybe)
This commit is contained in:
parent
bc48bfef25
commit
0601dc20ca
@ -28,7 +28,8 @@
|
|||||||
"webpack-cli": "^3.3.12"
|
"webpack-cli": "^3.3.12"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "webpack --config webpack.config.js",
|
"build": "webpack --config webpack.full.config.js",
|
||||||
|
"partial": "webpack --config webpack.partial.config.js",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
|
@ -9,7 +9,7 @@ export class Human2RegexParser extends CstParser {
|
|||||||
|
|
||||||
const $ = this;
|
const $ = this;
|
||||||
|
|
||||||
const Count = $.RULE("Count", () => {
|
const Number = $.RULE("Number", () => {
|
||||||
$.OR([
|
$.OR([
|
||||||
{ ALT: () => $.CONSUME(T.One) },
|
{ ALT: () => $.CONSUME(T.One) },
|
||||||
{ ALT: () => $.CONSUME(T.Two) },
|
{ ALT: () => $.CONSUME(T.Two) },
|
||||||
@ -22,13 +22,49 @@ export class Human2RegexParser extends CstParser {
|
|||||||
{ ALT: () => $.CONSUME(T.Nine) },
|
{ ALT: () => $.CONSUME(T.Nine) },
|
||||||
{ ALT: () => $.CONSUME(T.Ten) },
|
{ ALT: () => $.CONSUME(T.Ten) },
|
||||||
{ ALT: () => $.CONSUME(T.Zero) },
|
{ ALT: () => $.CONSUME(T.Zero) },
|
||||||
|
{ ALT: () => $.CONSUME(T.NumberLiteral) },
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
const MatchStatement = $.RULE("MatchStatement", () => {
|
// 1, 1..2, between 1 and/to 2 inclusively/exclusively
|
||||||
|
const Count = $.RULE("Count", () => {
|
||||||
|
$.OR([
|
||||||
|
{ ALT: () => {
|
||||||
|
$.OPTION(() => $.CONSUME(T.Exactly));
|
||||||
|
$.SUBRULE(Number);
|
||||||
|
}},
|
||||||
|
{ ALT: () => {
|
||||||
|
$.OPTION(() => $.CONSUME(T.From));
|
||||||
|
$.SUBRULE(Number);
|
||||||
|
$.OR([
|
||||||
|
{ ALT: () => $.CONSUME(T.OrMore) },
|
||||||
|
{ ALT: () => {
|
||||||
|
$.CONSUME(T.To);
|
||||||
|
$.SUBRULE(Number);
|
||||||
|
}}
|
||||||
|
]);
|
||||||
|
}},
|
||||||
|
|
||||||
|
{ ALT: () => {
|
||||||
|
$.CONSUME(T.Between);
|
||||||
|
$.SUBRULE(Number);
|
||||||
|
$.OR([
|
||||||
|
{ ALT: () => $.CONSUME(T.To) },
|
||||||
|
{ ALT: () => $.CONSUME(T.And) }
|
||||||
|
]);
|
||||||
|
$.SUBRULE(Number);
|
||||||
$.OPTION(() => {
|
$.OPTION(() => {
|
||||||
$.CONSUME(T.Optional);
|
$.OR([
|
||||||
|
{ ALT: () => $.CONSUME(T.Inclusive) },
|
||||||
|
{ ALT: () => $.CONSUME(T.Exclusive) }
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
|
}}
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
const MatchStatement = $.RULE("Match Statement", () => {
|
||||||
|
$.OPTION(() => $.CONSUME(T.Optional));
|
||||||
$.CONSUME(T.Match);
|
$.CONSUME(T.Match);
|
||||||
$.OPTION(() => {
|
$.OPTION(() => {
|
||||||
$.SUBRULE(Count);
|
$.SUBRULE(Count);
|
||||||
@ -41,7 +77,7 @@ export class Human2RegexParser extends CstParser {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const UsingStatement = $.RULE("UsingStatement", () => {
|
const UsingStatement = $.RULE("Using Statement", () => {
|
||||||
$.CONSUME(T.Using);
|
$.CONSUME(T.Using);
|
||||||
$.AT_LEAST_ONE_SEP({
|
$.AT_LEAST_ONE_SEP({
|
||||||
SEP: T.And,
|
SEP: T.And,
|
||||||
@ -57,6 +93,13 @@ export class Human2RegexParser extends CstParser {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const Statement = $.RULE("Statement", () => {
|
||||||
|
$.OR([
|
||||||
|
{ ALT: () => $.SUBRULE(MatchStatement) },
|
||||||
|
{ ALT: () => $.SUBRULE(UsingStatement) }
|
||||||
|
]);
|
||||||
$.OPTION(() => $.CONSUME(T.EndOfLine));
|
$.OPTION(() => $.CONSUME(T.EndOfLine));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -20,13 +20,12 @@ export const Then = createToken({name: "Then", pattern: /then/i });
|
|||||||
export const Anything = createToken({name: "Anything", pattern: /(any|anything|any thing)(s)?/i});
|
export const Anything = createToken({name: "Anything", pattern: /(any|anything|any thing)(s)?/i});
|
||||||
export const Of = createToken({name: "Of", pattern: /of/i});
|
export const Of = createToken({name: "Of", pattern: /of/i});
|
||||||
export const Or = createToken({name: "Or", pattern: /or/i});
|
export const Or = createToken({name: "Or", pattern: /or/i});
|
||||||
export const And = createToken({name: "And", pattern: /and/i});
|
export const And = createToken({name: "And", pattern: /and|,/i});
|
||||||
export const Word = createToken({name: "WordSpecifier", pattern: /word(s)?/i});
|
export const Word = createToken({name: "Word Specifier", pattern: /word(s)?/i});
|
||||||
export const Digit = createToken({name: "DigitSpecifier", pattern: /digit(s)?/i});
|
export const Digit = createToken({name: "Digit Specifier", pattern: /digit(s)?/i});
|
||||||
export const Character = createToken({name: "CharacterSpecifier", pattern: /character(s)?/i});
|
export const Character = createToken({name: "Character Specifier", pattern: /character(s)?/i});
|
||||||
export const Whitespace = createToken({name: "WhitespaceSpecifier", pattern: /(white space|whitespace)(s)?/i});
|
export const Whitespace = createToken({name: "Whitespace Specifier", pattern: /(white space|whitespace)(s)?/i});
|
||||||
export const Number = createToken({name: "NumberSpecifier", pattern: /number(s)?/i});
|
export const Number = createToken({name: "NumberSpecifier", pattern: /number(s)?/i});
|
||||||
export const Multiple = createToken({name: "Multiple", pattern: /multiple/i});
|
|
||||||
export const As = createToken({name: "As", pattern: /as/i});
|
export const As = createToken({name: "As", pattern: /as/i});
|
||||||
export const If = createToken({name: "If", pattern: /if/i});
|
export const If = createToken({name: "If", pattern: /if/i});
|
||||||
export const Start = createToken({name: "Start", pattern: /start(s)?/i});
|
export const Start = createToken({name: "Start", pattern: /start(s)?/i});
|
||||||
@ -53,7 +52,7 @@ export const A = createToken({name: "A", pattern: /a(n)?/i }); //, longer_alt: A
|
|||||||
export const The = createToken({name: "The", pattern: /the/i }); //, longer_alt: Then});
|
export const The = createToken({name: "The", pattern: /the/i }); //, longer_alt: Then});
|
||||||
export const Exactly = createToken({name: "Exactly", pattern: /exact(ly)?/i});
|
export const Exactly = createToken({name: "Exactly", pattern: /exact(ly)?/i});
|
||||||
export const Inclusive = createToken({name: "Inclusive", pattern: /inclusive(ly)?/i});
|
export const Inclusive = createToken({name: "Inclusive", pattern: /inclusive(ly)?/i});
|
||||||
export const exclusive = createToken({name: "Exclusive", pattern: /exclusive(ly)?/i});
|
export const Exclusive = createToken({name: "Exclusive", pattern: /exclusive(ly)?/i});
|
||||||
export const From = createToken({name: "From", pattern: /from/i});
|
export const From = createToken({name: "From", pattern: /from/i});
|
||||||
export const To = createToken({name: "To", pattern: /(to|\-|\.\.|\.\.\.)/i});
|
export const To = createToken({name: "To", pattern: /(to|\-|\.\.|\.\.\.)/i});
|
||||||
export const Create = createToken({name: "Create", pattern: /create(s)?/i});
|
export const Create = createToken({name: "Create", pattern: /create(s)?/i});
|
||||||
@ -62,20 +61,23 @@ export const Repeat = createToken({name: "Repeat", pattern: /repeat(s|ing)?/i});
|
|||||||
export const Newline = createToken({name: "Newline", pattern: /(new line|newline)/i});
|
export const Newline = createToken({name: "Newline", pattern: /(new line|newline)/i});
|
||||||
export const None = createToken({name: "None", pattern: /none/i});
|
export const None = createToken({name: "None", pattern: /none/i});
|
||||||
export const Neither = createToken({name: "Neither", pattern: /neither/i});
|
export const Neither = createToken({name: "Neither", pattern: /neither/i});
|
||||||
export const CarriageReturn = createToken({name: "CarriageReturn", pattern: /carriage return/i});
|
export const CarriageReturn = createToken({name: "Carriage Return", pattern: /carriage return/i});
|
||||||
export const CaseInsensitive = createToken({name: "CaseInsensitive", pattern: /case insensitive/i});
|
export const CaseInsensitive = createToken({name: "Case Insensitive", pattern: /case insensitive/i});
|
||||||
export const CaseSensitive = createToken({name: "CaseSensitive", pattern: /case sensitive/i});
|
export const CaseSensitive = createToken({name: "Case Sensitive", pattern: /case sensitive/i});
|
||||||
export const OrMore = createToken({name: "OrMore", pattern: /\+/ });
|
export const OrMore = createToken({name: "Or More", pattern: /\+/ });
|
||||||
|
|
||||||
|
export const LBracket = createToken({name: "Left Bracket", pattern: /\(/ });
|
||||||
|
export const RBracket = createToken({name: "Right Bracket", pattern: /\)/ });
|
||||||
|
|
||||||
export const Indent = createToken({name: "Indent", pattern: /(( ){4}\t)/ });
|
export const Indent = createToken({name: "Indent", pattern: /(( ){4}\t)/ });
|
||||||
export const EndOfLine = createToken({name: "EOL", pattern: /\n/ });
|
export const EndOfLine = createToken({name: "EOL", pattern: /\n/ });
|
||||||
export const WhiteSpace = createToken({name: "WhiteSpace", pattern: /\s+/, group: Lexer.SKIPPED });
|
export const WhiteSpace = createToken({name: "Whitespace", pattern: /\s+/, group: Lexer.SKIPPED });
|
||||||
export const SingleLineComment = createToken({name: "SingleLineComment", pattern: /(#|\/\/).*/, group: Lexer.SKIPPED });
|
export const SingleLineComment = createToken({name: "Single-Line Comment", pattern: /(#|\/\/).*/, group: Lexer.SKIPPED });
|
||||||
export const MultilineComment = createToken({name: "MultiLineComment", pattern: /\/\*(.*)\*\//, line_breaks: true, group: Lexer.SKIPPED });
|
export const MultilineComment = createToken({name: "Multi-Line Comment", pattern: /\/\*(.*)\*\//, line_breaks: true, group: Lexer.SKIPPED });
|
||||||
|
|
||||||
export const Identifier = createToken({name: "Identifier", pattern: /[a-z]\w*/i });
|
export const Identifier = createToken({name: "Identifier", pattern: /[a-z]\w*/i });
|
||||||
export const NumberLiteral = createToken({name: "NumberLiteral", pattern: /-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d+)?/ });
|
export const NumberLiteral = createToken({name: "Number Literal", pattern: /-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d+)?/ });
|
||||||
export const StringLiteral = createToken({name: "StringLiteral", pattern: /"(?:[^\\"]|\\(?:[bfnrtv"\\/]|u[0-9a-f]{4}|U[0-9a-f]{8}))*"/i });
|
export const StringLiteral = createToken({name: "String Literal", pattern: /"(?:[^\\"]|\\(?:[bfnrtv"\\/]|u[0-9a-f]{4}|U[0-9a-f]{8}))*"/i });
|
||||||
|
|
||||||
|
|
||||||
export const AllTokens = [
|
export const AllTokens = [
|
||||||
@ -103,7 +105,6 @@ export const AllTokens = [
|
|||||||
Character,
|
Character,
|
||||||
Whitespace,
|
Whitespace,
|
||||||
Number,
|
Number,
|
||||||
Multiple,
|
|
||||||
As,
|
As,
|
||||||
If,
|
If,
|
||||||
Start,
|
Start,
|
||||||
@ -129,7 +130,7 @@ export const AllTokens = [
|
|||||||
The,
|
The,
|
||||||
Exactly,
|
Exactly,
|
||||||
Inclusive,
|
Inclusive,
|
||||||
exclusive,
|
Exclusive,
|
||||||
From,
|
From,
|
||||||
Create,
|
Create,
|
||||||
Called,
|
Called,
|
||||||
|
@ -1,84 +0,0 @@
|
|||||||
export enum TokenType {
|
|
||||||
END_OF_STATEMENT,
|
|
||||||
INDENT,
|
|
||||||
BETWEEN,
|
|
||||||
QUOTE,
|
|
||||||
NUMBER,
|
|
||||||
PARTIAL_KEYWORD,
|
|
||||||
KEYWORD_BETWEEN,
|
|
||||||
KEYWORD_OPTIONAL,
|
|
||||||
KEYWORD_MATCH,
|
|
||||||
KEYWORD_THEN,
|
|
||||||
KEYWORD_AND,
|
|
||||||
KEYWORD_OR,
|
|
||||||
KEYWORD_ANY,
|
|
||||||
KEYWORD_OF,
|
|
||||||
KEYWORD_NONE,
|
|
||||||
KEYWORD_NEITHER,
|
|
||||||
KEYWODE_WORD_SPECIFIER,
|
|
||||||
KEYWORD_DIGIT_SPECIFIER,
|
|
||||||
KEYWORD_CHAR_SPECIFIER,
|
|
||||||
KEYWORD_WHITESPACE_SPECIFIER,
|
|
||||||
KEYWORD_NUMBER_SPECIFIER,
|
|
||||||
KEYWORD_MULTIPLE,
|
|
||||||
KEYWORD_AS,
|
|
||||||
KEYWORD_IF,
|
|
||||||
KEYWORD_STARTS,
|
|
||||||
KEYWORD_WITH,
|
|
||||||
KEYWORD_ENDS,
|
|
||||||
KEYWORD_ELSE,
|
|
||||||
KEYWORD_UNLESS,
|
|
||||||
KEYWORD_WHILE,
|
|
||||||
KEYWORD_MORE,
|
|
||||||
KEYWORD_USING,
|
|
||||||
KEYWORD_GLOBAL,
|
|
||||||
KEYWORD_MULTILINE,
|
|
||||||
KEYWORD_EXACT,
|
|
||||||
KEYWORD_MATCHING,
|
|
||||||
KEYWORD_NOT,
|
|
||||||
KEYWORD_TAB,
|
|
||||||
KEYWORD_LINEFEED,
|
|
||||||
KEYWORD_CARRIAGE_RETURN,
|
|
||||||
KEYWORD_GROUP,
|
|
||||||
KEYWORD_BY,
|
|
||||||
KEYWORD_ARTICLE,
|
|
||||||
KEYWORD_EXACTLY,
|
|
||||||
KEYWORD_INCLUSIVE,
|
|
||||||
KEYWORD_EXCLUSIVE,
|
|
||||||
KEYWORD_FROM,
|
|
||||||
KEYWORD_TO,
|
|
||||||
KEYWORD_CREATE,
|
|
||||||
KEYWORD_CALLED,
|
|
||||||
KEYWORD_REPEAT,
|
|
||||||
KEYWORD_NEWLINE,
|
|
||||||
KEYWORD_CASE_SENSITIVE,
|
|
||||||
KEYWORD_CASE_INSENSITIVE
|
|
||||||
}
|
|
||||||
|
|
||||||
export class TokenError extends Error {
|
|
||||||
constructor(message: string, public line: number, public position: number) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public to_string(): string {
|
|
||||||
return `Token Error: ${this.line}:${this.position} ${this.message}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class Token {
|
|
||||||
constructor(public type: TokenType, public line: number, public position: number, public length: number, public token_string?: string) {
|
|
||||||
/* nothing required */
|
|
||||||
}
|
|
||||||
|
|
||||||
public to_string(): string {
|
|
||||||
let str = `${this.line}:${this.position} ${TokenType[this.type]}`;
|
|
||||||
|
|
||||||
if (this.token_string) {
|
|
||||||
str += ` "${this.token_string}"`;
|
|
||||||
}
|
|
||||||
|
|
||||||
str += ` (size: ${this.length})`;
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
}
|
|
@ -9,6 +9,7 @@ const CopyPlugin = require("copy-webpack-plugin");
|
|||||||
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
||||||
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
|
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
|
||||||
const WebpackBeforeBuildPlugin = require("before-build-webpack");
|
const WebpackBeforeBuildPlugin = require("before-build-webpack");
|
||||||
|
const TerserPlugin = require("terser-webpack-plugin");
|
||||||
|
|
||||||
const config = {
|
const config = {
|
||||||
prod: true,
|
prod: true,
|
||||||
@ -82,7 +83,8 @@ module.exports = {
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
optimization: {
|
optimization: {
|
||||||
minimizer: [ new OptimizeCSSAssetsPlugin({}) ]
|
minimize: config.prod,
|
||||||
|
minimizer: [ new TerserPlugin({cache: true, parallel: true}), new OptimizeCSSAssetsPlugin({}) ]
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
new CopyPlugin({
|
new CopyPlugin({
|
||||||
@ -101,6 +103,6 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
filename: "bundle.min.js",
|
filename: "bundle.min.js",
|
||||||
path: path.resolve("docs")
|
path: path.resolve(config.dst)
|
||||||
}
|
}
|
||||||
};
|
};
|
32
webpack.partial.config.js
Normal file
32
webpack.partial.config.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||||
|
/* eslint-disable no-undef */
|
||||||
|
const path = require("path");
|
||||||
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
mode: "development",
|
||||||
|
entry: path.resolve("./src/", "script.ts"),
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.ts$/,
|
||||||
|
use: "ts-loader",
|
||||||
|
exclude: /node_modules/
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.css$/,
|
||||||
|
use: [ MiniCssExtractPlugin.loader, "css-loader" ]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new MiniCssExtractPlugin({ filename: "bundle.min.css" }),
|
||||||
|
],
|
||||||
|
resolve: {
|
||||||
|
extensions: [ ".ts", ".js" ]
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
filename: "bundle.min.js",
|
||||||
|
path: path.resolve("docs")
|
||||||
|
}
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user