Regular Expression support (regex)

This commit is contained in:
Jaime Humberto Macias Bustamante
2025-09-03 20:13:39 -07:00
parent 85f51df7eb
commit d344ede669
5 changed files with 60 additions and 3 deletions
+2
View File
@@ -134,6 +134,8 @@ class Bytes {
// TODO
case ECast(e, _):
// TODO
case ERegex(e, f):
// TODO
case EConst(c):
doEncodeConst(c);
case EIdent(v):
+1
View File
@@ -84,6 +84,7 @@ enum Expr {
EClass( name:String, fields:Array<Expr>, ?extend:String, interfaces:Array<String>, ?isFinal:Bool, ?isPrivate:Bool );
EEnum( en:EnumDecl, ?isAbstract:Bool );
ECast(e:Expr, ?t:CType);
ERegex(e:String, flags:String);
}
@:structInit
+2
View File
@@ -885,6 +885,8 @@ class Interp {
variables.set(en.name, enumThingy);
case ECast(e, _): // TODO
return expr(e);
case ERegex(e, f):
return new EReg(e, f);
case EConst(c):
switch (c) {
case CInt(v): return v;
+52 -3
View File
@@ -43,6 +43,7 @@ enum Token {
TDoubleDot;
TMeta( s : String );
TPrepro( s : String );
TRegex( e : String, f:String );
}
@:structInit
@@ -72,6 +73,11 @@ class Parser {
**/
public var allowJSON : Bool;
/**
activate Regular Expression parsing
**/
public var allowRegex : Bool;
/**
allow types declarations
**/
@@ -115,6 +121,8 @@ class Parser {
#end
static inline var regexFlags: String = "igmsu";
public function new() {
line = 1;
opChars = "+*/-=!><&|^%~";
@@ -513,6 +521,8 @@ class Parser {
var e = parseExpr();
isVar = false;
return mk(EMeta(id, args, e),p1);
case TRegex(e, f) if(allowRegex):
return mk(ERegex(e, f), p1);
default:
return unexpected(tk);
}
@@ -1863,7 +1873,7 @@ class Parser {
return StringTools.fastCodeAt(input, readPos++);
}
function readString( until:Int ):String {
function readString( until:Int, regex:Bool = false ):String {
var c = 0;
var b = new StringBuf();
var esc = false;
@@ -1911,7 +1921,7 @@ class Parser {
b.addChar(k);
default: invalidChar(c);
}
} else if( c == 92 )
} else if( c == 92 && !regex)
esc = true;
else if( c == until )
break;
@@ -1923,6 +1933,39 @@ class Parser {
return b.toString();
}
function readFlags():String {
if(!allowRegex) return null;
var c = 0;
var b = new StringBuf();
var old = line;
var s = input;
#if hscriptPos
var p1 = readPos - 1;
#end
while(true) {
var c = readChar();
if( StringTools.isEof(c) ) {
line = old;
error(EUnterminatedString, p1, p1);
break;
}
// semicolon
if(c == 59) {
this.char = c;
break;
}
var f = String.fromCharCode(c);
if(regexFlags.indexOf(f) != -1)
b.addChar(c);
else
invalidChar(c);
}
return b.toString();
}
function token():Token {
//function token(?infos : Null<haxe.PosInfos>) {
//function ttrace(v:Dynamic, ?infos : Null<haxe.PosInfos>) {
@@ -2146,7 +2189,7 @@ class Parser {
invalidChar(char);
default:
if( ops[char] ) {
var op = String.fromCharCode(char);
var op:String = String.fromCharCode(char);
while( true ) {
char = readChar();
if( StringTools.isEof(char) ) char = 0;
@@ -2156,6 +2199,11 @@ class Parser {
}
var pop = op;
op += String.fromCharCode(char);
if( allowRegex && op == "~/") {
var e = readString(char, true);
var f = readFlags();
return TRegex(e, f);
}
if( !opPriority.exists(op) && opPriority.exists(pop) ) {
if( op == "//" || op == "/*" )
return tokenComment(op,char);
@@ -2370,6 +2418,7 @@ class Parser {
case TDoubleDot: ":";
case TMeta(id): "@" + id;
case TPrepro(id): "#" + id;
case TRegex(e, f): '~/$e/${f == null ? '' : f}';
}
}
+3
View File
@@ -186,6 +186,9 @@ class Printer {
addType(t);
add(")");
}
case ERegex(e, f):
add('~/$e/$f');
add(';\n');
case EConst(c):
switch( c ) {
case CInt(i): add(i);