# NEWS for Lrama ## Lrama 0.6.0 (2023-12-25) ### User defined parameterizing rules Allow to define parameterizing rule by `%rule` directive. ``` %rule pair(X, Y): X Y { $$ = $1 + $2; } ; %% program: stmt ; stmt: pair(ODD, EVEN) | pair(EVEN, ODD) ; ``` ## Lrama 0.5.11 (2023-12-02) ### Type specification of parameterizing rules Allow to specify type of rules by specifying tag, `` in below example. Tag is post-modification style. ``` %union { int i; } %% program : option(number) | number_alias? ; ``` https://github.com/ruby/lrama/pull/272 ## Lrama 0.5.10 (2023-11-18) ### Parameterizing rules (option, nonempty_list, list) Support function call style parameterizing rules for `option`, `nonempty_list` and `list`. https://github.com/ruby/lrama/pull/197 ### Parameterizing rules (separated_list) Support `separated_list` and `separated_nonempty_list` parameterizing rules. ``` program: separated_list(',', number) // Expanded to program: separated_list_number separated_list_number: ε separated_list_number: separated_nonempty_list_number separated_nonempty_list_number: number separated_nonempty_list_number: separated_nonempty_list_number ',' number ``` ``` program: separated_nonempty_list(',', number) // Expanded to program: separated_nonempty_list_number separated_nonempty_list_number: number separated_nonempty_list_number: separated_nonempty_list_number ',' number ``` https://github.com/ruby/lrama/pull/204 ## Lrama 0.5.9 (2023-11-05) ### Parameterizing rules (suffix) Parameterizing rules are template of rules. It's very common pattern to write "list" grammar rule like: ``` opt_args: /* none */ | args ; args: arg | args arg ``` Lrama supports these suffixes: * `?`: option * `+`: nonempty list * `*`: list Idea of Parameterizing rules comes from Menhir LR(1) parser generator (https://gallium.inria.fr/~fpottier/menhir/manual.html#sec32). https://github.com/ruby/lrama/pull/181 ## Lrama 0.5.7 (2023-10-23) ### Racc parser Replace Lrama's parser from hand written parser to LR parser generated by Racc. Lrama uses `--embedded` option to generate LR parser because Racc is changed from default gem to bundled gem by Ruby 3.3 (https://github.com/ruby/lrama/pull/132). https://github.com/ruby/lrama/pull/62 ## Lrama 0.5.4 (2023-08-17) ### Runtime configuration for error recovery Meke error recovery function configurable on runtime by two new macros. * `YYMAXREPAIR`: Expected to return max length of repair operations. `%parse-param` is passed to this function. * `YYERROR_RECOVERY_ENABLED`: Expected to return bool value to determine error recovery is enabled or not. `%parse-param` is passed to this function. https://github.com/ruby/lrama/pull/74 ## Lrama 0.5.3 (2023-08-05) ### Error Recovery Support token insert base Error Recovery. `-e` option is needed to generate parser with error recovery functions. https://github.com/ruby/lrama/pull/44 ## Lrama 0.5.2 (2023-06-14) ### Named References Instead of positional references like `$1` or `$$`, named references allow to access to symbol by name. ``` primary: k_class cpath superclass bodystmt k_end { $primary = new_class($cpath, $bodystmt, $superclass); } ``` Alias name can be declared. ``` expr[result]: expr[ex-left] '+' expr[ex.right] { $result = $[ex-left] + $[ex.right]; } ``` Bison supports this feature from 2.5. ### Add parse params to some macros and functions `%parse-param` are added to these macros and functions to remove ytab.sed hack from Ruby. * `YY_LOCATION_PRINT` * `YY_SYMBOL_PRINT` * `yy_stack_print` * `YY_STACK_PRINT` * `YY_REDUCE_PRINT` * `yysyntax_error` https://github.com/ruby/lrama/pull/40 See also: https://github.com/ruby/ruby/pull/7807 ## Lrama 0.5.0 (2023-05-17) ### stdin mode When `-` is given as grammar file name, reads the grammar source from STDIN, and takes the next argument as the input file name. This mode helps pre-process a grammar source. https://github.com/ruby/lrama/pull/8 ## Lrama 0.4.0 (2023-05-13) This is the first version migrated to Ruby. This version generates "parse.c" compatible with Bison 3.8.2.