On 7 November 2012 21:37, Peter van der Zee <e...@qfox.nl> wrote:

> How would you deal with cases like `foo(/)/);` and `foo(5//)/g);` ?
> So how would you deal with combinations of regular expressions and
> divisions in awkward places? Or are you already using a tokenizer and
> hardcoded rules on when to parse for regex/div?


The first stage I use is to assign a "left" value for example if an
expression occurs then I give it a value of true if not then false. If the
left value is false then it's a regex. Where it isn't as easy is when you
have var statements or need to know what a colon is. Is it a case colon or
label or ternary. I decided to hardcode the entire js syntax into a series
of very specific rules for example:

var rules = {

ArrayComma:createRule('NewExpressions,Expression,Postfix'),

ArrayOpen:createRule('Statements,Operators,NewExpressions,Prefix'),


ArrayClose:createRule('ArrayComma,ArrayOpen,Expression,Postfix'),
.....


The property name is the current state and the values are the previous
state. This allows you to control what certain statements do what they are
allowed to follow. I tokenize and parse simultaneously.

Both your cases are invalid javascript in the browser. So they will never
reach the MentalJS parser because I do a syntax check in the browser first
before passing it to MentalJS. However if I turn off this check here is how
Mental JS parses `foo(/)/);`

<Identifier>$foo$</Identifier><FunctionCallOpen>(</FunctionCallOpen><RegExp>/)/</RegExp><FunctionCallClose>)</FunctionCallClose><EndStatement>;</EndStatement>

I could fix your invalid syntax automatically in the regex state machine by
rewriting /)/ to /\)/ and then it would execute :)

The second example would fail mental js syntax check because the comment
removes the paren and so the opening and closing parens are uneven which
will result nicely in a syntax error.
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to