====== Overview of the Newer Streamlined Syntax ====== The following is a summary of CongoCC's streamlined syntax from the perspective of somebody migrating from legacy JavaCC. Note that, unlike CongoCC's predecessor, JavaCC 21, CongoCC //does not// support the legacy syntax. Any existing grammar file must be converter. There is a utility available that automatically converts the legacy syntax to the streamlined syntax. You can pick up the [[https://parsers.org/download/javacc-full.jar|latest build of JavaCC 21]] and the converter can be invoked via ''java -jar javacc-full.jar convert MyGrammarfile''. (N.B. The converter is somewhat imperfect, and you may well need to hand-edit the results. Even so, it is bound to be timesaver.) ===== Nonterminals ===== There is no need to write empty parentheses after a nonterminal for a production that takes no parameters. Thus: Foo() Bar() Baz() can now be written as: Foo Bar Baz ===== BNF Productions ===== - There is no need to write ''%%void%%'' in front of productions with no return value. - A production which takes no parameters no longer needs empty parentheses. - There is no need for an empty code block, i.e. ''%%{}%%'' as the first thing in your production's definition. (//I mean, assuming that you don't actually need to put some code at the top of your production.//) - Rather than put the definition of your production inside braces (like Java actions), they are preferably listed (with no opening delimiter) and then terminated with a semicolon. The above four points (along with the earlier point about no-args nonterminals not needing parentheses) combine such that, where you would previously write: void Foobar() : {} { Foo() Bar() } you would now write: Foobar : Foo Bar; ===== A list of lexical specifications, a.k.a. Token Productions are written without the curly braces. ===== In this case, they are written with no opening ''%%{%%'' and the list is ended with a semicolon. Thus, instead of writing: TOKEN #Delimiter : { | : ")"> | : "{"> | : "}"> } the newer syntax is: TOKEN #Delimiter : | | | ; This was deemedd to be preferable, not because it saves much space (it doesn't!) but because one aspect of the newer syntax is that the ''%%{...}%%'' are reserved for elements that really are embedded Java actions. As you can see, in the newer syntax for BNF productions, the only use of ''%%{...}%%'' is for actual Java code. ===== The Options at the top of a file do not need to be in any sort of block. ===== Since the options, like ''%%TREE_BUILDING_ENABLED=false%%'' can only occur at the very top of a file anyway, there is no need for them to be in some special construct ''%%Options {..}%%''. Thus, where you would previous have: options { BASE_SRC_DIR=".."; PARSER_PACKAGE="com.acme.foolang"; } You now simply put: BASE_SRC_DIR=".."; PARSER_PACKAGE="com.acme.foolang"; at the top of your file. ===== The syntax for INJECT is also streamlined. ===== //N.B. This, of course, is not a change from legacy JavaCC, since legacy JavaCC never had an ''%%INJECT%%'' statement!// You can (optionally) dispense with the parentheses in: ''%%INJECT(ClassDeclaration) :%%'' The first block after the colon does not need braces around it. Either part of the injection can be left out. Thus, if the only point is to indicate that a Node extends a class (or implements an interface or you want to use an Annotation), where you previously had to write: INJECT(MyNode) : { extends AbstractBaseNode } {} (Actually, the final empty block ''%%{}%%'' has been optional for some time in these spots, but I don't believe I ever documented that! But now it is much more streamlined.) You can now write: INJECT MyNode : extends AbstractBaseNode A more complex INJECTION that does insert some code might now look something like: INJECT MyNode : import java.util.List; extends AbstractBaseNode implements Nullable { private List foos; public List getFoos() {return foos;} public void setFoos(List foos) {this.foos = foos;} } Note that, in the statements immediately following the colon (and immediately preceding the opening brace) the first ends with a semicolon and the other two do not. Well, the ''%%extends%%'' and ''%%implements%%'' elements in Java do not end in with a semicolon, while an ''%%import%%'' statement does. However, if the above looks funny to you, you can (optionally) end the other two lines with a semicolon and the parser will not complain! ===== New SCAN construct which replaces LOOKAHEAD ===== The new ''SCAN'' instruction supersedes the legacy ''LOOKAHEAD''. See [[scan statement|here]] for more information. ===== New "up to here" syntax ===== The [[up to here]] syntax provides a way to specify [[choice points|lookahead]] in a much more clean, intuitive way. See [[up to here|here]] for more information.