Comments (5)
Works for me.
$ cat mcomment.ne
mcomment -> "/*" [^*]:* ("*":+ [^/*] [^*]:*):* "*":* "*/"
$ node bin/nearleyc.js mcomment.ne > mcomment.js
$ <testcases perl -lne'die "cannot parse \x27$_\x27" if system("node bin/nearleythere.js mcomment.js -i \x27$_\x27")' >/dev/null
$ echo $?
0
$ cat testcases
/* /**** * ********** /*/
/* / **/
/* /** ***/
/* / /// ** /*/
/* ///**** * /// */
/* */
/* ** / ****** ** **/
/* *** *** * **** */
/* / /*****/
/* / *** /**** **/
/* / ****/
/* // * * * //// /*/
/* //*** / //*/
/* /* /* /* *** //***/
/* /*/
/* * / * * /*** // / */
/* * /* */
/* * *** / */
/* * *** / ********** */
/* */
/* ** *** // /** * / */
/* *** */
/* ***** * */
/* ****** ****** /*/
/* / * *****/
/* / */
/* / / ******* //** **/
/* / / ///** /* * ****/
/* / * // ** ***/
/* / * / // /* /*** // ** */
/* / * *** ** /**** ** *******/
/* / ***/
/* / **** /** */
/* / ****/
/* / *****/
/* // / * /* ******** */
/* // / // **/
/* // */
/* // ***** //* ///* */
/* /// **** // */
/* ///*** /////*/
/* ///***/
/* //* /** ///***** * / ** **/
/* //*/
/* //** *** * * *** // ***/
/* /* / / /*** * //*/
/* /* */
/* /* *** /* *** / /********/
/* /*/
/* /**/
/* /*** / /// ** *** /*/
/* /*** * / / ** /* */
/* /*** ** * ** ******** ** */
/* /***/
/* /**** */
/* /**** ** ** // / *** / / **/
/* /******** ************* **/
/* /********/
/* * *** *** /*/
/* * ****** */
/* * ****** //** / / * /*/
/* * / //****** * ****/
/* * / */
/* * ////** //// **/
/* * * ///*** * / ****** /* /*/
/* * ** */
/* * ******** // * ****** / / */
/* */
/* ** /** * / / */
/* ** / *** * /* *****/
/* ** // ****/
/* ** /******* //** /* /**** */
/* ** * //* /* ***** // /*** */
/* ** */
/* *** ** /** /*/
/* *** *** **/
/* *** * /*/
/* *** *** ** */
/* **** ** /**** / ** ***/
/* **** ** ***/
/* ***** / **** ************/
/* ***** ** ** //* */
/* *****/
/* ****** *** */
/* ******/
/* ********* *****/
/*/ / / /** / / **/
/*/ /* ** ****/
/*/ /* //***** /// /* */
/*/ //** /*/
/*/ ** * **/
/*/ ** */
/*/ *** ** **/
/*/ *** ******** / ******/
/*/ **** /// * / **/
/*/ ******* * / */
/*/ / /***** ******/
/*/ / * **/
/*/ / *** //**** ****/
/*/ // * / / *******/
/*/ //* /** *** * **** **** */
/*/ //*/
/*/ //** / */
/*/ //** / //****/
/*/ //***** /** * /////* */
/*/ /** * / ***/
/*/ /**** /* *** ** /***/
/*/ /**** /*** //* */
/*/ /***** /****** // /**/
/*/ * /* **************** / */
/*/ */
/*/ ** / / ** *** */
/*/ ** /* * * **** */
/*/ ***/
/*/ ***** *** /******** // */
/*// / * //*/
/*// / ** **** /// **** *** /*/
/*// //// / */
/*// /*/
/*// ** / * **** * / /*** /*/
/*/// **** * */
/*/// //* /* /* *** * ****/
/*/// ** ** // * / /** */
/*/// *** /****** ****/
/*/// / ***/
/*/// / * ** //* / // /*/
/*/// * /// */
/*//// ** / /*/
/*///// * /// *** /**/
/*///// **/
/*/////****** / *** /// */
/*///* //* /*****/
/*///* ** //** // */
/*///**** / * *** // //*** ***/
/*//* /*/
/*//* * // */
/*//* ** ** */
/*//* *** ******** *********/
/*//*/
/*//** /***/
/*//** * /*/
/*//** **** ***** /** ***/
/*//*** * *** * //// */
/*//*** * * / * * / ********/
/*//**** * ***** * / */
/*//**** ** **/
/*//****/
/*//***** * * **/
/*/* */
/*/* /* ** //// * /*/
/*/* /******* /* //*** //* **/
/*/* /******** ** ** */
/*/* * // ****** ** // */
/*/* * /****** /* /*/
/*/* ** ** **** /**** / */
/*/* ***/
/*/* ***** **** /*/
/*/* ******/
/*/*/
/*/** ***/
/*/** /**** //**/
/*/** ***** */
/*/** / //** ///////*/
/*/** / *** */
/*/** ///* **** // // ** //**/
/*/** ****/
/*/**/
/*/*** / ***** ** /***/
/*/*** //* * ****** ********/
/*/*** /* ** / /***** */
/*/*** /** ///* ****/
/*/*** ** ** * */
/*/**** //// /*** /// ** /*****/
/*/**** **** *** * /** //** /*/
/*/**** ** ///* ///* ///*/
/*/***** *********/
/*/****** // /* *****/
/*/****** **** // ////* *** * */
/*/******** ** * */
/*/******** // // / ** **/
/*/***********/
/** / ***** * */
/** * / */
/** *** /// ///***/
/** /// /* ** // *******/
/** */
/** ***/
/** / ***** / //**/
/** / //// / * */
/** / * / * * **/
/** / **** // ** **** /* // /*/
/** //**/
/** //*** /**/
/** /* * */
/** /*/
/** /** /******** / * **/
/** /** ** */
/** /***** ** * **** */
/** * / ///* **** /***/
/** * /* ***** */
/** * /* * /**** ///* * / /*/
/** * /*/
/** * /***/
/** */
/** ** *** * *** ** /** /*/
/** ** **** ******/
/** ** ***** **/
/** ** ******/
/** *** * * /* */
/** *** *** /****/
/** *** **** /////// *****/
/** **** // * ****** **** **/
/** ***** ***** */
/** *********** * * / ***/
/**/
/*** *** ///* /***** /*/
/*** ** / /** ** /***** */
/*** / * */
/*** ** /* ****** / /**/
/*** ******* // ///*/
/*** / ****/
/*** / /****/
/*** /*/
/*** /** / ** *** **/
/*** /** *** / ///// ****** **/
/*** /***** /** ** ///* /*/
/*** * ///* /***/
/*** * ** * /* */
/*** */
/*** **** /* */
/*** ****/
/*** ***** /*** * / */
/***/
/**** * /* //// *****/
/**** * **** / / */
/**** ******/
/**** // ***** ****/
/**** /*** /// */
/**** /***** /** */
/**** * // * */
/**** *** */
/**** ******** */
/****/
/***** / */
/***** */
/***** ** //* * * * */
/***** *** / /* ///** ** *****/
/***** ***** */
/***** / /* / ** // / // */
/***** */
/***** ***** // */
/*****/
/****** / ************* ** //*/
/****** /*/
/****** /******* /**/
/****** * ///** **** /***/
/****** * * /* //*** ** */
/****** * *** /* /*******/
/****** * *** ** // / ** / **/
/****** */
/****** *** */
/******/
/******* * /** /* / *****/
/******* ** ** *** ****/
/******* ///* /* / */
/******* * //* * ** /*/
/******* ** / ** *****/
/******* ****** */
/******** * //**** //** /* /***/
/******** */
/********/
/********* *** ** */
/********* /// *****/
/********* */
/********* ***** // *** *******/
/********** **/
/********** // * ***/
/************ /** / **/
from nearley.
That does appear to work. Feel free to make a pull request with that added to the js grammar. Thanks!
from nearley.
I'm not sure what @daxim 's expression does. Is it equivalent to:
mcomment -> "/*" ([^*] | "*" [^/]):* "*/"
which (I think) should work?
from nearley.
There are different results when one chains comments. Let
chain -> mcomment:+
and then parse /***//***/
. My result:
[ [ [ [ '/*', [], [], [ '*' ], '*/' ],
[ '/*', [], [], [ '*' ], '*/' ] ] ] ]
Your result:
[ [ [ [ '/*',
[ [ '*', '*' ],
[ '/' ],
[ '/' ],
[ '*', '*' ] ],
'*/' ] ] ] ]
I interpret this result to be a misparse – one long comment instead of two short – similar to the greedy/ungreedy problem in regex. Do you concur?
from nearley.
Ah, interesting. Mentally, I actually read /***//***/
as two consecutive comments.
It shouldn't really matter, though, right? In any case, both comments would likely be ignored by whatever traverses the syntax tree?
The ECMAScript standard says (http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf pg. 16):
MultiLineComment ::
/* MultiLineCommentChars_opt */
MultiLineCommentChars ::
MultiLineNotAsteriskChar MultiLineCommentChars_opt
* PostAsteriskCommentChars_opt
PostAsteriskCommentChars ::
MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentChars_opt
* PostAsteriskCommentChars_opt
MultiLineNotAsteriskChar ::
SourceCharacter but not *
MultiLineNotForwardSlashOrAsteriskChar ::
SourceCharacter but not one of / or *
I believe that agrees with my interpretation. The standard says that multiline comments containing newlines are to be considered syntactically equivalent to newlines, so the only real issue here is whether
/*
*//*
*/
should return 1 or 2 newlines. However, I'm pretty sure this won't be an issue, so we're fine.
from nearley.
Related Issues (20)
- Can lexer be confused by large inputs? HOT 1
- docs suggest installing globally and shouldn't HOT 1
- `row -> row | row newline rows` vs `rows -> row (newline row):*`
- Fixing Nullable start rule TODO in lib/nearley.js?
- Leo enhancements for right recursion
- Ambiguity problem with FEEL
- Parser render two identical ast
- https://nearley.js.org/ is down HOT 1
- nearley-unparser binary: rules.map is not a function HOT 3
- Automatic conversion to textmate grammar HOT 1
- Can't undertsand indentifier token HOT 1
- Understanding ambiguity: possible bug with "-" character?
- How to match end of input? HOT 1
- Removing ambiquity by enforcing precedence order HOT 6
- State of discarding tokenizers is sometimes not saved
- Nearley's own grammar is ambiguous?
- The streaming implementation does not take in account that a token may be split across two chunks HOT 4
- Provide a way for users to format their own error messages
- Wrong input lines on error HOT 4
- Use nearley parser at front end, how to reset parser for new input HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from nearley.