Hmm.... > t_expr :: Parsec Object > t_expr = > (do comment_eol > t_expr1 <- t_expr > return t_expr1) > <|> > (do (tINITIAL_INDENT_NO_BANG <|> many1 hspace) > (n_expr > <|> do comment_eol > t_expr2 <- t_expr > return t_expr2)) > <|> > (do tINITIAL_INDENT_WITH_BANG > fail "cannot start with a bang!") > <|> > (do eof > return $ generate_eof) > <|> > i_expr
Looks fine! On 1/10/13, David A. Wheeler <dwhee...@dwheeler.com> wrote: > The file "sweet.g" in the development branch is coming together as a > reasonable BNF for sweet-expressions. > > I intend to post 1-2 productions at a time, for review and comment. Here's > the first one, the top-level production that defines sweet-expressions. > This production handles special cases (initial indents, blank lines that > precede the sweet-expression, etc.), then calls the production i_expr > ("indented expression") for normal cases. > > Comments? > > Feel free to look at the whole file, sweet.g in the develop branch, which > defines some of the terminals and non-terminals, such as: > * comment_eol: End-of-line, optionally preceded by a ";..." comment. > * INITIAL_INDENT_NO_BANG: An initial indent without "!" > * n_expr: Neoteric-expression > > For EOF handling, for now I'm assuming that the system will insert an extra > EOL at the end of a non-empty file if there isn't one already. > > --- David A. Wheeler > > ============================= > > // Top-level sweet-expression production, t_expr. > // This production handles special cases, then in the normal case > // drops to the i_expr production. > > // The rule for "indent processing disabled on initial top-level hspace" > // is a very simple (and clever) BNF construction by Alan Manuel K. Gloria. > // If there is an indent it simply reads a single n-expression and returns. > // If there is more than one on an initially-indented line, the later > // horizontal space will not have have been read, so this production will > // fire again on the next invocation, doing the right thing. > > // Although "!" is an indent character, it's an error to use it at the > // topmost level. The only reason to indent at the top is to disable > // indent processing, for backwards compatibility. Detecting this as > // an error should detect some mistakes. > > t_expr returns [Object v] > : comment_eol t_expr1=t_expr {$v=$t_expr1.v;} /* Initial lcomment, retry > */ > | (INITIAL_INDENT_NO_BANG | hspace+ ) > (n_expr {$v = $n_expr.v;} /* indent processing disabled */ > | comment_eol t_expr2=t_expr {$v=$t_expr2.v;} ) > | INITIAL_INDENT_WITH_BANG error > | EOF {generate_eof();} /* End of file */ > | i_expr {$v = $i_expr.v;} /* Normal case */ ; > > > ------------------------------------------------------------------------------ > Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS, > MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current > with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft > MVPs and experts. ON SALE this month only -- learn more at: > http://p.sf.net/sfu/learnmore_122712 > _______________________________________________ > Readable-discuss mailing list > Readable-discuss@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/readable-discuss > ------------------------------------------------------------------------------ Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS, MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft MVPs and experts. SALE $99.99 this month only -- learn more at: http://p.sf.net/sfu/learnmore_122412 _______________________________________________ Readable-discuss mailing list Readable-discuss@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/readable-discuss