summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@colm.net>2021-09-21 20:29:24 -0700
committerAdrian Thurston <thurston@colm.net>2021-09-21 20:33:03 -0700
commit47274bbc4915e6e99327e92c5189d8a7b3900f71 (patch)
treeb9e9d62bfd21586c74f38a279a2a3c3479bbe2b8
parente88bda068d4a25f2afa7f48821e0f539405c8c6a (diff)
downloadcolm-47274bbc4915e6e99327e92c5189d8a7b3900f71.tar.gz
allow the base expression in deref and offset to be an expression
Previously allowed only identifier as the base. This is necessary to use the generated DATA() as the base in these expressions, which can be modified by access and therefore must be an expression.
-rw-r--r--src/cgil/ril.lm4
-rw-r--r--src/cgil/rlhc-c.lm8
-rw-r--r--src/cgil/rlhc-crack.lm8
-rw-r--r--src/cgil/rlhc-csharp.lm8
-rw-r--r--src/cgil/rlhc-d.lm8
-rw-r--r--src/cgil/rlhc-go.lm4
-rw-r--r--src/cgil/rlhc-java.lm8
-rw-r--r--src/cgil/rlhc-js.lm14
-rw-r--r--src/cgil/rlhc-julia.lm8
-rw-r--r--src/cgil/rlhc-ocaml.lm16
-rw-r--r--src/cgil/rlhc-ruby.lm4
-rw-r--r--src/cgil/rlhc-rust.lm8
-rw-r--r--src/libfsm/codegen.cc14
-rw-r--r--src/libfsm/codegen.h1
14 files changed, 63 insertions, 50 deletions
diff --git a/src/cgil/ril.lm b/src/cgil/ril.lm
index cde6ce93..8a50bf50 100644
--- a/src/cgil/ril.lm
+++ b/src/cgil/ril.lm
@@ -88,8 +88,8 @@ def expr_factor
| [ident] :Ident
| [ident `[ expr `]] :ArraySub
| [ident `[ expr `] `. Field: ident] :ArraySubField
-| [`offset `( ident `, expr `)] :Offset
-| [`deref `( ident `, expr `)] :Deref
+| [`offset `( base: expr `, expr `)] :Offset
+| [`deref `( base: expr `, expr `)] :Deref
| [number] :Number
| [`TRUE] :True
| [`FALSE] :False
diff --git a/src/cgil/rlhc-c.lm b/src/cgil/rlhc-c.lm
index dfc24d1d..66061e98 100644
--- a/src/cgil/rlhc-c.lm
+++ b/src/cgil/rlhc-c.lm
@@ -112,21 +112,21 @@ namespace c_gen
}
case Offset
{
- << "[ident] + [expr( expr )]"
+ << "[base] + [expr( expr )]"
}
case Deref
{
<< "(*( [expr(expr)] ))
}
- case [`TRUE]
+ case True
{
<< "1"
}
- case [`FALSE]
+ case False
{
<< "1"
}
- case [N: `nil]
+ case Nil
{
<< "0"
}
diff --git a/src/cgil/rlhc-crack.lm b/src/cgil/rlhc-crack.lm
index bebe7cd5..75358a30 100644
--- a/src/cgil/rlhc-crack.lm
+++ b/src/cgil/rlhc-crack.lm
@@ -117,15 +117,15 @@ namespace crack_gen
send Parser
"[I]\[[expr( E )]\]"
}
- case [`offset `( ident `, expr `)]
+ case [`offset `( Base: expr `, Offset: expr `)]
{
send Parser
- [expr( ExprFactor.expr )]
+ [expr( Offset )]
}
- case [`deref `( ident `, expr `)]
+ case [`deref `( Base: expr `, Offset: expr `)]
{
send Parser
- [ ExprFactor.ident '[' expr( ExprFactor.expr ) ']']
+ [ expr( Base ) '[' expr( Offset ) ']']
}
case [`TRUE]
{
diff --git a/src/cgil/rlhc-csharp.lm b/src/cgil/rlhc-csharp.lm
index 078157c5..0b3eb8ba 100644
--- a/src/cgil/rlhc-csharp.lm
+++ b/src/cgil/rlhc-csharp.lm
@@ -108,15 +108,15 @@ namespace csharp_gen
send Parser
[ExprFactor.ident O expr( TL ) C]
}
- case ['offset' '(' ident ',' expr ')']
+ case ['offset' '(' Base: expr ',' Offset: expr ')']
{
send Parser
- [expr( ExprFactor.expr )]
+ [expr( Offset )]
}
- case ['deref' '(' ident ',' expr ')']
+ case ['deref' '(' Base: expr ',' Offset: expr ')']
{
send Parser
- [ ExprFactor.ident '[' expr( ExprFactor.expr ) ']']
+ [ expr( Base ) '[' expr( Offset ) ']']
}
case [T: `TRUE]
{
diff --git a/src/cgil/rlhc-d.lm b/src/cgil/rlhc-d.lm
index 2a047e68..a81259c9 100644
--- a/src/cgil/rlhc-d.lm
+++ b/src/cgil/rlhc-d.lm
@@ -122,16 +122,16 @@ namespace d_gen
[ExprFactor.ident O expr(TL) C]
}
case
- [`offset `( ident `, expr `)]
+ [`offset `( Base: expr `, Offset: expr `)]
{
send Parser
- "& [ExprFactor.ident] \[ [expr(ExprFactor.expr)] \]
+ "& [expr(Base)] \[ [expr( Offset )] \]
}
case
- [`deref `( ident `, expr `)]
+ [`deref `( Base: expr `, Offset: expr `)]
{
send Parser
- "(*( [expr(ExprFactor.expr)] ))
+ "(*( [expr(Offset)] ))
}
case
[T: `TRUE]
diff --git a/src/cgil/rlhc-go.lm b/src/cgil/rlhc-go.lm
index b8353d10..1eb2a61b 100644
--- a/src/cgil/rlhc-go.lm
+++ b/src/cgil/rlhc-go.lm
@@ -108,11 +108,11 @@ namespace go_gen
}
case Offset
{
- << "int([expr(expr )])
+ << "int([expr(expr)])
}
case Deref
{
- << [ident '[ ' expr( expr ) ' ]' ]
+ << [ base '[ ' expr( expr ) ' ]' ]
}
case True
{
diff --git a/src/cgil/rlhc-java.lm b/src/cgil/rlhc-java.lm
index a458369f..e9ba3dd5 100644
--- a/src/cgil/rlhc-java.lm
+++ b/src/cgil/rlhc-java.lm
@@ -116,16 +116,16 @@ namespace java_gen
[ExprFactor.ident O expr( TL ) C]
}
case
- ['offset' '(' ident ',' expr ')']
+ ['offset' '(' Base: expr ',' Offset: expr ')']
{
send Parser
- [expr( ExprFactor.expr )]
+ [expr( Offset )]
}
case
- ['deref' '(' ident ',' expr ')']
+ ['deref' '(' Base: expr ',' Offset: expr ')']
{
send Parser
- [ ExprFactor.ident '[' expr( ExprFactor.expr ) ']']
+ [ expr( Base ) '[' expr( Offset ) ']']
}
case
[T: `TRUE]
diff --git a/src/cgil/rlhc-js.lm b/src/cgil/rlhc-js.lm
index 29a61346..013d391a 100644
--- a/src/cgil/rlhc-js.lm
+++ b/src/cgil/rlhc-js.lm
@@ -116,18 +116,18 @@ namespace js_gen
send Parser
[ExprFactor.ident O expr( TL ) C]
}
- case ['offset' '(' ident ',' expr ')']
+ case ['offset' '(' Base: expr ',' Offset: expr ')']
{
send Parser
- [expr( ExprFactor.expr )]
+ [expr( Offset )]
}
- case ['deref' '(' ident ',' expr ')']
+ case ['deref' '(' Base: expr ',' Offset: expr ')']
{
- send Parser [ExprFactor.ident]
- if $ExprFactor.ident == 'data'
- send Parser ['.charCodeAt(' expr( ExprFactor.expr ) ')']
+ send Parser [Base]
+ if $Base == 'data'
+ send Parser ['.charCodeAt(' expr( Offset ) ')']
else
- send Parser ['[' expr( ExprFactor.expr ) ']']
+ send Parser ['[' expr( Offset ) ']']
}
case [T: `TRUE]
{
diff --git a/src/cgil/rlhc-julia.lm b/src/cgil/rlhc-julia.lm
index 72108994..96ab4afd 100644
--- a/src/cgil/rlhc-julia.lm
+++ b/src/cgil/rlhc-julia.lm
@@ -125,15 +125,15 @@ namespace julia_gen
send Parser
"[I]\[1+([expr( E )])\]"
}
- case [`offset `( ident `, expr `)]
+ case [`offset `( Base: ident `, Offset: expr `)]
{
send Parser
- [expr( ExprFactor.expr )]
+ [expr( Offset )]
}
- case [`deref `( I: ident `, E: expr `)]
+ case [`deref `( Base: expr `, Offset: expr `)]
{
send Parser
- "[I]\[1+([ expr( E ) ])\]"
+ "[expr( Base )]\[1+([ expr( Offset ) ])\]"
}
case [`TRUE]
{
diff --git a/src/cgil/rlhc-ocaml.lm b/src/cgil/rlhc-ocaml.lm
index f68b61be..4c6e4a73 100644
--- a/src/cgil/rlhc-ocaml.lm
+++ b/src/cgil/rlhc-ocaml.lm
@@ -123,23 +123,23 @@ namespace ml_gen
send Parser
[^I '_' ^F '.(' expr(E) ')']
}
- case ['offset' '(' ident ',' expr ')']
+ case ['offset' '(' expr ',' Offset: expr ')']
{
send Parser
- [expr( ExprFactor.expr )]
+ [expr( Offset )]
}
- case ['deref' '(' I: ident ',' Expr: expr ')']
+ case ['deref' '(' Base: expr ',' Offset: expr ')']
{
- if ( $I == 'data' )
+ if ( $Base == 'data' )
send Parser 'Char.code '
- if ( StaticVarMap->find( $I ) ) {
+ if ( StaticVarMap->find( $Base ) ) {
send Parser
- "[I].( [ expr( Expr ) ] )"
+ "[expr( Base )].( [ expr( Offset ) ] )"
}
else {
send Parser
- "[I].\[[ expr( Expr ) ]\]"
+ "[expr( Base )].\[[ expr( Offset ) ]\]"
}
}
case [T: `TRUE]
@@ -162,7 +162,7 @@ namespace ml_gen
number( Number )
}
case [I: ident] {
- if ( StaticVarMap->find( $I ) ) {
+ if ( StaticVarMap->find( $I ) || $I == 'data' ) {
send Parser
[^I]
}
diff --git a/src/cgil/rlhc-ruby.lm b/src/cgil/rlhc-ruby.lm
index 87119465..d9e897c5 100644
--- a/src/cgil/rlhc-ruby.lm
+++ b/src/cgil/rlhc-ruby.lm
@@ -125,8 +125,8 @@ void expr_factor( ExprFactor: expr_factor )
case ['deref' '(' ident ',' expr ')']
{
send Parser
- [ ExprFactor.ident '[' expr( ExprFactor.expr ) ']']
- if $ExprFactor.ident == 'data'
+ [ ExprFactor.base '[' expr( ExprFactor.expr ) ']']
+ if $ExprFactor.base == 'data'
send Parser '.ord'
}
case [T: `TRUE]
diff --git a/src/cgil/rlhc-rust.lm b/src/cgil/rlhc-rust.lm
index 03f8b688..7045881d 100644
--- a/src/cgil/rlhc-rust.lm
+++ b/src/cgil/rlhc-rust.lm
@@ -109,15 +109,15 @@ namespace rust_gen
send Parser
"[I]\[([expr( E )]) as usize\]"
}
- case ['offset' '(' ident ',' expr ')']
+ case ['offset' '(' E1: expr ',' E2: expr ')']
{
send Parser
- "( [expr( ExprFactor.expr )] ) as i32"
+ "( [expr( E2 )] ) as i32"
}
- case ['deref' '(' I: ident ',' E: expr ')']
+ case ['deref' '(' E1: expr ',' E2: expr ')']
{
send Parser
- "[I]\[([expr( E )]) as usize\]
+ "[expr( E1 )]\[([expr( E2 )]) as usize\]
}
case [T: `TRUE]
{
diff --git a/src/libfsm/codegen.cc b/src/libfsm/codegen.cc
index db8cc60a..ac06aaf8 100644
--- a/src/libfsm/codegen.cc
+++ b/src/libfsm/codegen.cc
@@ -413,6 +413,18 @@ string CodeGen::ACCESS()
return ret.str();
}
+string CodeGen::DATA()
+{
+ ostringstream ret;
+ if ( red->dataExpr == 0 )
+ ret << "data";
+ else {
+ ret << OPEN_HOST_EXPR();
+ INLINE_LIST( ret, red->dataExpr, 0, false, false );
+ ret << CLOSE_HOST_EXPR();
+ }
+ return ret.str();
+}
string CodeGen::P()
{
@@ -543,7 +555,7 @@ string CodeGen::GET_KEY()
}
else {
/* Expression for retrieving the key, use simple dereference. */
- ret << "( " << DEREF( "data", P() ) << ")";
+ ret << "( " << DEREF( DATA(), P() ) << ")";
}
return ret.str();
}
diff --git a/src/libfsm/codegen.h b/src/libfsm/codegen.h
index dcc24e3b..e42de065 100644
--- a/src/libfsm/codegen.h
+++ b/src/libfsm/codegen.h
@@ -200,6 +200,7 @@ protected:
virtual string GET_KEY();
+ string DATA();
string P();
string PE();
string vEOF();