luaparse icon indicating copy to clipboard operation
luaparse copied to clipboard

Multiple independent parsers / reentrancy

Open fstirlitz opened this issue 6 years ago • 1 comments

Currently, this code works:

luaparse.parse({ wait: true }).write('foo = "');
console.info(luaparse.parse('bar"'));

It prints out:

{
	"type": "Chunk",
	"body": [
		{
			"type": "AssignmentStatement",
			"variables": [
				{
					"type": "Identifier",
					"name": "foo"
				}
			],
			"init": [
				{
					"type": "StringLiteral",
					"value": "bar",
					"raw": "\"bar\""
				}
			]
		}
	],
	"comments": []
}

This is because the library maintains a single lexer and parser state shared between invocations of the parse function; there is no way to concurrently parse multiple Lua scripts. Code that expects each .parse({ wait: true }) to create a new parser independent of any previously created one is in for a nasty surprise.

There should be a way to create multiple isolated parser states. This will probably necessitate a quite invasive re-write, and may break some backwards compatibility unless this is done through separate API calls. Then though, the sort of code that relies on non-reentrancy is not one I wish to personally support.

fstirlitz avatar Aug 02 '19 13:08 fstirlitz

I’ll think I’ll add a re-entrant API in 0.3.2, while leaving the current one in place, with semantics preserved. Not sure what I’ll do in 0.4. I may remove the stand-alone parse call entirely, or I may change it to construct a temporary parser state, so that each parse call is independent from the next. Either will be technically a breaking change.

fstirlitz avatar Jun 04 '21 19:06 fstirlitz