* data/skeletons/lalr1.cc: Prepare for Java's LAC. * data/skeletons/lalr1.java: Style fixes. --- README-hacking.md | 8 ++-- data/skeletons/lalr1.cc | 12 +++--- data/skeletons/lalr1.java | 72 ++++++++++++++++++--------------- examples/c/bistromathic/parse.y | 6 +-- 4 files changed, 53 insertions(+), 45 deletions(-)
diff --git a/README-hacking.md b/README-hacking.md index 9c5d9a3e..f0bc4341 100644 --- a/README-hacking.md +++ b/README-hacking.md @@ -346,12 +346,14 @@ and [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html). Unfortunately at some point some GNU Coding Style was installed in Java, but it's an error. So we should for instance stop putting spaces in function calls. -Because we are standardizing the code, it is currently inconsistent. +Because we are standardizing the code, it is currently inconsistent. Treat +acronyms as words: `yyLacCheck`, not `yyLACCheck`. Use a 2-space indentation (Google) rather than 4 (Oracle). -Don't use the "yy" prefix for public members: "getExpectedTokens", not -"yyexpectedTokens" or "yygetExpectedTokens". +Don't use the `yy` prefix for public members: `getExpectedTokens`, not +`yyexpectedTokens` or `yygetExpectedTokens`. Keep the `yy` prefix though +for private details. ## Commit Messages Imitate the style we use. Use `git log` to get sources of inspiration. diff --git a/data/skeletons/lalr1.cc b/data/skeletons/lalr1.cc index 5c260d04..c593094a 100644 --- a/data/skeletons/lalr1.cc +++ b/data/skeletons/lalr1.cc @@ -20,8 +20,7 @@ m4_include(b4_skeletonsdir/[c++.m4]) # api.value.type=variant is valid. m4_define([b4_value_type_setup_variant]) -# Check the value of %define parse.lac, where LAC stands for lookahead -# correction. +# parse.lac b4_percent_define_default([[parse.lac]], [[none]]) b4_percent_define_check_values([[[[parse.lac]], [[full]], [[none]]]]) b4_define_flag_if([lac]) @@ -935,7 +934,7 @@ b4_dollar_popdef])[]dnl if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.kind ()) {]b4_lac_if([[ if (!yy_lac_establish_ (yyla.kind ())) - goto yyerrlab;]])[ + goto yyerrlab;]])[ goto yydefault; } @@ -946,7 +945,7 @@ b4_dollar_popdef])[]dnl if (yy_table_value_is_error_ (yyn)) goto yyerrlab;]b4_lac_if([[ if (!yy_lac_establish_ (yyla.kind ())) - goto yyerrlab; + goto yyerrlab; ]])[ yyn = -yyn; goto yyreduce; @@ -1442,7 +1441,9 @@ b4_dollar_popdef])[]dnl follows. If no initial context is currently established for the current lookahead, then check if that lookahead can eventually be shifted if syntactic actions continue from the current context. */ - if (!yy_lac_established_) + if (yy_lac_established_) + return true; + else { #if ]b4_api_PREFIX[DEBUG YYCDEBUG << "LAC: initial context established for " @@ -1451,7 +1452,6 @@ b4_dollar_popdef])[]dnl yy_lac_established_ = true; return yy_lac_check_ (yytoken); } - return true; } // Discard any previous initial lookahead context. diff --git a/data/skeletons/lalr1.java b/data/skeletons/lalr1.java index 72bef4c5..c7004535 100644 --- a/data/skeletons/lalr1.java +++ b/data/skeletons/lalr1.java @@ -25,7 +25,10 @@ m4_define([b4_symbol_no_destructor_assert], [%destructor does not make sense in Java])])]) b4_symbol_foreach([b4_symbol_no_destructor_assert]) -# Setup some macros for api.push-pull. +## --------------- ## +## api.push-pull. ## +## --------------- ## + b4_percent_define_default([[api.push-pull]], [[pull]]) b4_percent_define_check_values([[[[api.push-pull]], [[pull]], [[push]], [[both]]]]) @@ -52,7 +55,8 @@ b4_use_push_for_pull_if([ # Define a macro to encapsulate the parse state variables. This # allows them to be defined either in parse() when doing pull parsing, # or as class instance variable when doing push parsing. -m4_define([b4_define_state],[[ +m4_define([b4_define_state], +[[ /* Lookahead token kind. */ int yychar = YYEMPTY_; /* Lookahead symbol kind. */ @@ -76,6 +80,10 @@ m4_define([b4_define_state],[[ ]b4_yystype[ yylval = null; ]])[ +## ------------- ## +## Parser File. ## +## ------------- ## + ]b4_output_begin([b4_parser_file_name])[ ]b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java], [2007-2015, 2018-2020])[ @@ -343,65 +351,63 @@ import java.text.MessageFormat; public int size = 16; public int height = -1; - public final void push (int state, ]b4_yystype[ value]b4_locations_if([, ]b4_location_type[ loc])[) { + public final void push(int state, ]b4_yystype[ value]b4_locations_if([, ]b4_location_type[ loc])[) { height++; - if (size == height) - { - int[] newStateStack = new int[size * 2]; - System.arraycopy (stateStack, 0, newStateStack, 0, height); - stateStack = newStateStack;]b4_locations_if([[ - ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2]; - System.arraycopy (locStack, 0, newLocStack, 0, height); - locStack = newLocStack;]]) - - b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2]; - System.arraycopy (valueStack, 0, newValueStack, 0, height); - valueStack = newValueStack; - - size *= 2; - } + if (size == height) { + int[] newStateStack = new int[size * 2]; + System.arraycopy(stateStack, 0, newStateStack, 0, height); + stateStack = newStateStack;]b4_locations_if([[ + ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2]; + System.arraycopy(locStack, 0, newLocStack, 0, height); + locStack = newLocStack;]]) + + b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2]; + System.arraycopy(valueStack, 0, newValueStack, 0, height); + valueStack = newValueStack; + + size *= 2; + } stateStack[height] = state;]b4_locations_if([[ locStack[height] = loc;]])[ valueStack[height] = value; } - public final void pop () { - pop (1); + public final void pop() { + pop(1); } - public final void pop (int num) { + public final void pop(int num) { // Avoid memory leaks... garbage collection is a white lie! if (0 < num) { - java.util.Arrays.fill (valueStack, height - num + 1, height + 1, null);]b4_locations_if([[ - java.util.Arrays.fill (locStack, height - num + 1, height + 1, null);]])[ + java.util.Arrays.fill(valueStack, height - num + 1, height + 1, null);]b4_locations_if([[ + java.util.Arrays.fill(locStack, height - num + 1, height + 1, null);]])[ } height -= num; } - public final int stateAt (int i) { + public final int stateAt(int i) { return stateStack[height - i]; } ]b4_locations_if([[ - public final ]b4_location_type[ locationAt (int i) { + public final ]b4_location_type[ locationAt(int i) { return locStack[height - i]; } ]])[ - public final ]b4_yystype[ valueAt (int i) { + public final ]b4_yystype[ valueAt(int i) { return valueStack[height - i]; } // Print the state stack on the debug stream. - public void print (java.io.PrintStream out) { + public void print(java.io.PrintStream out) { out.print ("Stack now"); - for (int i = 0; i <= height; i++) - { - out.print (' '); - out.print (stateStack[i]); - } - out.println (); + for (int i = 0; i <= height; i++) { + out.print(' '); + out.print(stateStack[i]); + } + out.println(); } } diff --git a/examples/c/bistromathic/parse.y b/examples/c/bistromathic/parse.y index 718ec904..25c2c5ec 100644 --- a/examples/c/bistromathic/parse.y +++ b/examples/c/bistromathic/parse.y @@ -117,13 +117,13 @@ // with TOK_ (e.g., TOK_EOF). %define api.token.prefix {TOK_} -// Customized syntax error messages (see yyreport_syntax_error). +// Customized syntax error messages (see yyreport_syntax_error)... %define parse.error custom -// with locations. +// ... with locations... %locations -// and accurate list of expected tokens. +// ... and accurate list of expected tokens. %define parse.lac full // Generate the parser description file (calc.output). -- 2.28.0
