Compare commits

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