summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ds9/library/block.tcl13
-rw-r--r--ds9/library/source.tcl2
-rw-r--r--ds9/parsers/blocklex.fcl22
-rw-r--r--ds9/parsers/blockparser.tac51
4 files changed, 88 insertions, 0 deletions
diff --git a/ds9/library/block.tcl b/ds9/library/block.tcl
index d4135f8..e18f452 100644
--- a/ds9/library/block.tcl
+++ b/ds9/library/block.tcl
@@ -284,6 +284,19 @@ proc BlockBackupRGB {ch which} {
proc ProcessBlockCmd {varname iname} {
upvar $varname var
+ upvar $iname ii
+
+ # we need to be realized
+ ProcessRealizeDS9
+
+ block::YY_FLUSH_BUFFER
+ block::yy_scan_string [lrange $var $ii end]
+ block::yyparse
+ incr ii [expr $block::yycnt-1]
+}
+
+proc oProcessBlockCmd {varname iname} {
+ upvar $varname var
upvar $iname i
# we need to be realized
diff --git a/ds9/library/source.tcl b/ds9/library/source.tcl
index 552fa32..cdb5d6a 100644
--- a/ds9/library/source.tcl
+++ b/ds9/library/source.tcl
@@ -190,6 +190,8 @@ source $ds9(root)/library/xpa.tcl
source $ds9(root)/library/binparser.tcl
source $ds9(root)/library/binlex.tcl
+source $ds9(root)/library/blockparser.tcl
+source $ds9(root)/library/blocklex.tcl
source $ds9(root)/library/dssesoparser.tcl
source $ds9(root)/library/dssesolex.tcl
source $ds9(root)/library/dsssaoparser.tcl
diff --git a/ds9/parsers/blocklex.fcl b/ds9/parsers/blocklex.fcl
new file mode 100644
index 0000000..272cecb
--- /dev/null
+++ b/ds9/parsers/blocklex.fcl
@@ -0,0 +1,22 @@
+#tab blockparser.tab.tcl
+
+%{
+%}
+
+#include defs.fin
+
+%%
+
+close {return $CLOSE_}
+fit {return $FIT_}
+in {return $IN_}
+lock {return $LOCK_}
+match {return $MATCH_}
+open {return $OPEN_}
+out {return $OUT_}
+to {return $TO_}
+
+#include yesno.fin
+#include base.fin
+
+%%
diff --git a/ds9/parsers/blockparser.tac b/ds9/parsers/blockparser.tac
new file mode 100644
index 0000000..53a22ca
--- /dev/null
+++ b/ds9/parsers/blockparser.tac
@@ -0,0 +1,51 @@
+%{
+%}
+
+#include yesno.tin
+#include base.tin
+
+%start command
+
+%token CLOSE_
+%token FIT_
+%token IN_
+%token LOCK_
+%token MATCH_
+%token OPEN_
+%token OUT_
+%token TO_
+
+%%
+
+#include yesno.trl
+#include base.trl
+
+command : block
+ | block {yyclearin; YYACCEPT} CMD_
+ ;
+
+block : CLOSE_ {BlockDestroyDialog}
+ | OPEN_ {BlockDialog}
+ | MATCH_ {MatchBlockCurrent}
+ | LOCK_ yesno {global block; set block(lock) $2; LockBlockCurrent}
+ | numeric {Block $1 $1}
+ | numeric numeric {Block $1 $2}
+ | IN_ {Block .5 .5}
+ | OUT_ {Block 2 2}
+ | TO_ blockTo
+ ;
+
+blockTo : numeric {global block; set block(factor) "$1 $1"; ChangeBlock}
+ | numeric numeric {global block; set block(factor) "$1 $2"; ChangeBlock}
+ | FIT_ {BlockToFit}
+ ;
+
+%%
+
+proc block::yyerror {msg} {
+ variable yycnt
+ variable yy_current_buffer
+ variable index_
+
+ ParserError $msg $yycnt $yy_current_buffer $index_
+}