Skip to content

Commit fd76cc8

Browse files
committed
[Parser] Roughly support V8 native syntax
1 parent dd3f15f commit fd76cc8

3 files changed

Lines changed: 26 additions & 13 deletions

File tree

src/AST/Parser.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ open System
44
open Common.Utils
55
open Common.Executor
66

7-
let parseAll jsonDir saveDir =
7+
let parseAll engine jsonDir saveDir =
88
let path = Reflection.Assembly.GetAssembly(typeof<Program>).Location
99
let js = (getDirName path) +/ "Parser.js"
10-
execNodeJs js (jsonDir + " " + saveDir)
10+
execNodeJs js (engine + " " + jsonDir + " " + saveDir)

src/AST/Parser.js

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,49 @@ const fs = require('fs');
33
const path = require('path');
44
const print = console.log;
55
const exit = process.exit;
6+
const PRE = "CodeAlchemist_V8Native"
7+
const RE = new RegExp (PRE, "g");
68

7-
function parse(fname){
9+
function resolveV8Native (src) {
10+
src = src.replace(/%[a-zA-Z]+/g, function(src){ return PRE + src.slice(1)});
11+
return esprima.parse(src);
12+
}
13+
14+
function parse(fname, isV8){
815
try{
9-
var str = fs.readFileSync(fname, 'utf8');
10-
return esprima.parse(str);
16+
var src = fs.readFileSync(fname, 'utf8');
17+
return esprima.parse(src);
1118
}catch(e){
12-
print(fname + ' : parse error! ' + e);
19+
if (isV8) {
20+
try { return resolveV8Native (src) }
21+
catch (e) { print (fname + ' : parse error! ' + e); }
22+
} else print(fname + ' : parse error! ' + e);
1323
}
1424
}
1525

16-
function astToJson(ast){
26+
function astToJson(ast, isV8){
1727
try{
1828
var ret = JSON.stringify(ast, null, 2);
1929
}catch(e){
2030
print('astsToJson error!');
2131
}
32+
if (isV8 && ret) ret = ret.replace(RE, "%")
2233
return ret
2334
}
2435

25-
function listdir(dir){
36+
function listDir(dir){
2637
return fs.readdirSync(dir)
2738
}
2839

2940
function main(){
30-
var js_dir = process.argv[2];
31-
var json_dir = process.argv[3];
32-
var js_files = listdir(js_dir);
41+
var engine = process.argv[2];
42+
var isV8 = (engine === "V8");
43+
var js_dir = process.argv[3];
44+
var json_dir = process.argv[4];
45+
var js_files = listDir(js_dir);
3346
for (let name of js_files){
3447
if(name.endsWith('.js')){
35-
let json = astToJson(parse(path.join(js_dir, name)));
48+
let json = astToJson(parse(path.join(js_dir, name), isV8), isV8);
3649
if(json !== undefined){
3750
fs.writeFileSync(path.join(json_dir, name), json);
3851
}

src/Main/Preprocess.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ open Analyzer.Instrument
1111
let parseSeed conf =
1212
let jsonDir = conf.PreprocDir +/ "json"
1313
if existDir jsonDir then ()
14-
else mkDir jsonDir |> parseAll conf.SeedDir
14+
else mkDir jsonDir |> parseAll (Conf.engineToStr conf.Engine) conf.SeedDir
1515
loads jsonDir
1616

1717
let rewrite rewriteDir loader ctx (name, ast) = async {

0 commit comments

Comments
 (0)