Skip to content

Commit 7ca6f30

Browse files
authored
Merge pull request #389 from yui-knk/TypedMidruleActions
Typed Midrule Actions
2 parents 992ca95 + c4bc0d2 commit 7ca6f30

File tree

12 files changed

+277
-77
lines changed

12 files changed

+277
-77
lines changed

NEWS.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,45 @@
11
# NEWS for Lrama
22

3+
## Lrama 0.6.5 (2024-03-xx)
4+
5+
### Typed Midrule Actions
6+
7+
User can specify the type of mid rule action by tag (`<bar>`) instead of specifying it with in an action.
8+
9+
```
10+
primary: k_case expr_value terms?
11+
{
12+
$<val>$ = p->case_labels;
13+
p->case_labels = Qnil;
14+
}
15+
case_body
16+
k_end
17+
{
18+
...
19+
}
20+
```
21+
22+
can be written as
23+
24+
```
25+
primary: k_case expr_value terms?
26+
{
27+
$$ = p->case_labels;
28+
p->case_labels = Qnil;
29+
}<val>
30+
case_body
31+
k_end
32+
{
33+
...
34+
}
35+
```
36+
37+
`%destructor` for midrule action is invoked only when tag is specified by Typed Midrule Actions.
38+
39+
Difference from Bison's Typed Midrule Actions is that tag is postposed in Lrama however it's preposed in Bison.
40+
41+
Bison supports this feature from 3.1.
42+
343
## Lrama 0.6.4 (2024-03-22)
444

545
### Parameterizing rules (preceded, terminated, delimited)

lib/lrama/grammar/rule_builder.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,11 @@ def process_rhs(parameterizing_rule_resolver)
128128
end
129129
when Lrama::Lexer::Token::UserCode
130130
prefix = token.referred ? "@" : "$@"
131+
tag = token.tag || lhs_tag
131132
new_token = Lrama::Lexer::Token::Ident.new(s_value: prefix + @midrule_action_counter.increment.to_s)
132133
@replaced_rhs << new_token
133134

134-
rule_builder = RuleBuilder.new(@rule_counter, @midrule_action_counter, i, lhs_tag: lhs_tag, skip_preprocess_references: true)
135+
rule_builder = RuleBuilder.new(@rule_counter, @midrule_action_counter, i, lhs_tag: tag, skip_preprocess_references: true)
135136
rule_builder.lhs = new_token
136137
rule_builder.user_code = token
137138
rule_builder.complete_input

lib/lrama/lexer/token/user_code.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ module Lrama
44
class Lexer
55
class Token
66
class UserCode < Token
7+
attr_accessor :tag
8+
79
def references
810
@references ||= _references
911
end

lib/lrama/parser.rb

Lines changed: 66 additions & 67 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

parser.y

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,10 +462,11 @@ rule
462462
{
463463
end_c_declaration
464464
}
465-
"}" named_ref_opt
465+
"}" named_ref_opt tag_opt
466466
{
467467
user_code = val[3]
468468
user_code.alias_name = val[6]
469+
user_code.tag = val[7]
469470
builder = val[0]
470471
builder.user_code = user_code
471472
result = builder

sig/lrama/lexer/token/user_code.rbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module Lrama
22
class Lexer
33
class Token
44
class UserCode < Token
5+
attr_accessor tag: Lexer::Token::Tag
56
@references: Array[Lrama::Grammar::Reference]
67

78
def references: () -> Array[Lrama::Grammar::Reference]

0 commit comments

Comments
 (0)