Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d344ede669 |
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user