1*6ccf9620SMasatake YAMATO.. _optscript: 2*6ccf9620SMasatake YAMATO 3*6ccf9620SMasatake YAMATOOptscript, a programming language for extending optlib parsers 4*6ccf9620SMasatake YAMATO-------------------------------------------------------------- 5*6ccf9620SMasatake YAMATO 6*6ccf9620SMasatake YAMATO.. contents:: `Table of contents` 7*6ccf9620SMasatake YAMATO :depth: 3 8*6ccf9620SMasatake YAMATO :local: 9*6ccf9620SMasatake YAMATO 10*6ccf9620SMasatake YAMATOPreparation for learning 11*6ccf9620SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~ 12*6ccf9620SMasatake YAMATO**Optscript** is an implementation of PostScript(tm) alike stack 13*6ccf9620SMasatake YAMATOoriented general purpose programming language. Developers of optlib 14*6ccf9620SMasatake YAMATOparsers can utilize the language for extending their parsers. 15*6ccf9620SMasatake YAMATO 16*6ccf9620SMasatake YAMATOYou may not be familiar with a stack oriented programming language. 17*6ccf9620SMasatake YAMATOThough there are some differences, the syntax and core non-graphical 18*6ccf9620SMasatake YAMATOoperators of Optscript and PostScript are the same. You can get the 19*6ccf9620SMasatake YAMATObasic knowledge for using Optscript from the materials for learning 20*6ccf9620SMasatake YAMATOPostScript. 21*6ccf9620SMasatake YAMATO 22*6ccf9620SMasatake YAMATO"PostScript Language Tutorial & Cookbook" published by Adobe Systems 23*6ccf9620SMasatake YAMATOInc. The book is known as "blue book". This is the best place to 24*6ccf9620SMasatake YAMATOstart. PostScript is a language for controlling printers. So it has 25*6ccf9620SMasatake YAMATOmany graphical operators. Optscript is for tagging, and doesn't have 26*6ccf9620SMasatake YAMATOsuch graphical operators. So you can skip the sections about graphics 27*6ccf9620SMasatake YAMATO(but you may want to read them because the book is written well). 28*6ccf9620SMasatake YAMATO 29*6ccf9620SMasatake YAMATOGhostscript (``gs`` or ``gsnd``) is an interpreter for the PostScript 30*6ccf9620SMasatake YAMATOlanguage and PDF files. Unlike Optscript, it implements the full-set of 31*6ccf9620SMasatake YAMATOPostScript features including graphical operators. It is available 32*6ccf9620SMasatake YAMATOunder either the GNU GPL Affero license. You can Ghostscript while 33*6ccf9620SMasatake YAMATOreading the blue book. Do web searching to know about Ghostscript. 34*6ccf9620SMasatake YAMATO 35*6ccf9620SMasatake YAMATO``optscript`` is an command that source files are included in 36*6ccf9620SMasatake YAMATOUniversal Ctags source tree. You can use it as the replacement of 37*6ccf9620SMasatake YAMATO``gs``. However, I recommend you to have ``gs`` at hand because 38*6ccf9620SMasatake YAMATO``optscript`` may have bugs. ``gs`` is much mature than ``optscript``. 39*6ccf9620SMasatake YAMATOHaving two interpreters helps you to know correct behavior. 40*6ccf9620SMasatake YAMATO 41*6ccf9620SMasatake YAMATOThough ``gs`` has much higher qualities than ``optscript``, eventually 42*6ccf9620SMasatake YAMATOyou may have to build the ``optscript`` command to learn Optscript 43*6ccf9620SMasatake YAMATOspecific operators. You can built the command with "``make 44*6ccf9620SMasatake YAMATOoptscript``". 45*6ccf9620SMasatake YAMATO 46*6ccf9620SMasatake YAMATO* red book 47*6ccf9620SMasatake YAMATO 48*6ccf9620SMasatake YAMATO TBW 49*6ccf9620SMasatake YAMATO 50*6ccf9620SMasatake YAMATOSyntax extension 51*6ccf9620SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~ 52*6ccf9620SMasatake YAMATO 53*6ccf9620SMasatake YAMATO``?`` is a prefix for representing a character literal. 54*6ccf9620SMasatake YAMATO 55*6ccf9620SMasatake YAMATOFor an example, ``?x`` represents 120. This is a short cut for ``(x) 0 56*6ccf9620SMasatake YAMATOget``. 57*6ccf9620SMasatake YAMATO 58*6ccf9620SMasatake YAMATOSome characters has special notation using ``\``. 59*6ccf9620SMasatake YAMATO 60*6ccf9620SMasatake YAMATO``?\t`` 61*6ccf9620SMasatake YAMATO 62*6ccf9620SMasatake YAMATO tab 63*6ccf9620SMasatake YAMATO 64*6ccf9620SMasatake YAMATO``?\n`` 65*6ccf9620SMasatake YAMATO 66*6ccf9620SMasatake YAMATO newline 67*6ccf9620SMasatake YAMATO 68*6ccf9620SMasatake YAMATO``?\_`` 69*6ccf9620SMasatake YAMATO 70*6ccf9620SMasatake YAMATO space 71*6ccf9620SMasatake YAMATO 72*6ccf9620SMasatake YAMATO 73*6ccf9620SMasatake YAMATOThe ``optscript`` command 74*6ccf9620SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~ 75*6ccf9620SMasatake YAMATO 76*6ccf9620SMasatake YAMATOYou can run optscript with no argument: 77*6ccf9620SMasatake YAMATO 78*6ccf9620SMasatake YAMATO.. code-block:: console 79*6ccf9620SMasatake YAMATO 80*6ccf9620SMasatake YAMATO $ ./optsript 81*6ccf9620SMasatake YAMATO OPT> 82*6ccf9620SMasatake YAMATO 83*6ccf9620SMasatake YAMATO``OPT>`` is the prompt of the interpreter. 84*6ccf9620SMasatake YAMATOYou can stop it with ``quit`` operator: 85*6ccf9620SMasatake YAMATO 86*6ccf9620SMasatake YAMATO.. code-block:: console 87*6ccf9620SMasatake YAMATO 88*6ccf9620SMasatake YAMATO $ ./optsript 89*6ccf9620SMasatake YAMATO OPT> quit 90*6ccf9620SMasatake YAMATO $ 91*6ccf9620SMasatake YAMATO 92*6ccf9620SMasatake YAMATO 93*6ccf9620SMasatake YAMATOLet's see some example sessions. To help you understand the session 94*6ccf9620SMasatake YAMATOeasily, Python sessions doing the same as Optscript are also written. 95*6ccf9620SMasatake YAMATO 96*6ccf9620SMasatake YAMATO* hello world 97*6ccf9620SMasatake YAMATO 98*6ccf9620SMasatake YAMATO Optscript: 99*6ccf9620SMasatake YAMATO 100*6ccf9620SMasatake YAMATO .. code-block:: console 101*6ccf9620SMasatake YAMATO 102*6ccf9620SMasatake YAMATO OPT> (hello, world) = 103*6ccf9620SMasatake YAMATO hello, world 104*6ccf9620SMasatake YAMATO 105*6ccf9620SMasatake YAMATO Python: 106*6ccf9620SMasatake YAMATO 107*6ccf9620SMasatake YAMATO .. code-block:: console 108*6ccf9620SMasatake YAMATO 109*6ccf9620SMasatake YAMATO >>> print ('hello, world') 110*6ccf9620SMasatake YAMATO hello, world 111*6ccf9620SMasatake YAMATO 112*6ccf9620SMasatake YAMATO* Adding 113*6ccf9620SMasatake YAMATO 114*6ccf9620SMasatake YAMATO Optscript: 115*6ccf9620SMasatake YAMATO 116*6ccf9620SMasatake YAMATO .. code-block:: console 117*6ccf9620SMasatake YAMATO 118*6ccf9620SMasatake YAMATO OPT> 2 3 add = 119*6ccf9620SMasatake YAMATO 5 120*6ccf9620SMasatake YAMATO 121*6ccf9620SMasatake YAMATO Python: 122*6ccf9620SMasatake YAMATO 123*6ccf9620SMasatake YAMATO .. code-block:: console 124*6ccf9620SMasatake YAMATO 125*6ccf9620SMasatake YAMATO >>> print (2 + 3) 126*6ccf9620SMasatake YAMATO 5 127*6ccf9620SMasatake YAMATO 128*6ccf9620SMasatake YAMATO* Variables 129*6ccf9620SMasatake YAMATO 130*6ccf9620SMasatake YAMATO Optscript: 131*6ccf9620SMasatake YAMATO 132*6ccf9620SMasatake YAMATO .. code-block:: console 133*6ccf9620SMasatake YAMATO 134*6ccf9620SMasatake YAMATO OPT> /x 2 def 135*6ccf9620SMasatake YAMATO OPT> /y 3 def 136*6ccf9620SMasatake YAMATO OPT> x y add = 137*6ccf9620SMasatake YAMATO 5 138*6ccf9620SMasatake YAMATO 139*6ccf9620SMasatake YAMATO Python: 140*6ccf9620SMasatake YAMATO 141*6ccf9620SMasatake YAMATO .. code-block:: console 142*6ccf9620SMasatake YAMATO 143*6ccf9620SMasatake YAMATO >>> x = 2 144*6ccf9620SMasatake YAMATO >>> y = 3 145*6ccf9620SMasatake YAMATO >>> print (x + y) 146*6ccf9620SMasatake YAMATO 5 147*6ccf9620SMasatake YAMATO 148*6ccf9620SMasatake YAMATO* Procedures 149*6ccf9620SMasatake YAMATO 150*6ccf9620SMasatake YAMATO Optscript: 151*6ccf9620SMasatake YAMATO 152*6ccf9620SMasatake YAMATO .. code-block:: console 153*6ccf9620SMasatake YAMATO 154*6ccf9620SMasatake YAMATO OPT> /add5_and_print { 5 add = } def 155*6ccf9620SMasatake YAMATO OPT> 4 add5_and_print 156*6ccf9620SMasatake YAMATO 9 157*6ccf9620SMasatake YAMATO 158*6ccf9620SMasatake YAMATO Python: 159*6ccf9620SMasatake YAMATO 160*6ccf9620SMasatake YAMATO .. code-block:: console 161*6ccf9620SMasatake YAMATO 162*6ccf9620SMasatake YAMATO >>> def add5_and_print(x): 163*6ccf9620SMasatake YAMATO ... print(x + 5); 164*6ccf9620SMasatake YAMATO >>> add5_and_print(4) 165*6ccf9620SMasatake YAMATO 9 166*6ccf9620SMasatake YAMATO 167*6ccf9620SMasatake YAMATO* string manipulation 168*6ccf9620SMasatake YAMATO 169*6ccf9620SMasatake YAMATO TBW 170*6ccf9620SMasatake YAMATO 171*6ccf9620SMasatake YAMATO* array manipulation 172*6ccf9620SMasatake YAMATO 173*6ccf9620SMasatake YAMATO TBW 174*6ccf9620SMasatake YAMATO 175*6ccf9620SMasatake YAMATO* dict manipulation 176*6ccf9620SMasatake YAMATO 177*6ccf9620SMasatake YAMATO TBW 178*6ccf9620SMasatake YAMATO 179*6ccf9620SMasatake YAMATO* control flow 180*6ccf9620SMasatake YAMATO 181*6ccf9620SMasatake YAMATO TBW 182*6ccf9620SMasatake YAMATO 183*6ccf9620SMasatake YAMATO* operators for printing 184*6ccf9620SMasatake YAMATO 185*6ccf9620SMasatake YAMATO TBW 186*6ccf9620SMasatake YAMATO 187*6ccf9620SMasatake YAMATO* reading script from file 188*6ccf9620SMasatake YAMATO 189*6ccf9620SMasatake YAMATO TBW 190*6ccf9620SMasatake YAMATO 191*6ccf9620SMasatake YAMATOOptscript in ctags 192*6ccf9620SMasatake YAMATO~~~~~~~~~~~~~~~~~~ 193*6ccf9620SMasatake YAMATO 194*6ccf9620SMasatake YAMATORelated options 195*6ccf9620SMasatake YAMATO............... 196*6ccf9620SMasatake YAMATO 197*6ccf9620SMasatake YAMATO.. code-block:: ctags 198*6ccf9620SMasatake YAMATO 199*6ccf9620SMasatake YAMATO --_prelude-<LANG>={{ 200*6ccf9620SMasatake YAMATO OPTSCRIPT CODE FRAGMENTS 201*6ccf9620SMasatake YAMATO }} 202*6ccf9620SMasatake YAMATO 203*6ccf9620SMasatake YAMATO --_sequel-<LANG>={{ 204*6ccf9620SMasatake YAMATO OPTSCRIPT CODE FRAGMENTS 205*6ccf9620SMasatake YAMATO }} 206*6ccf9620SMasatake YAMATO 207*6ccf9620SMasatake YAMATO --regex-<LANG>=<PATTERN>/<NAME>/[<KIND>/]LONGFLAGS...{{ 208*6ccf9620SMasatake YAMATO OPTSCRIPT CODE FRAGMENTS 209*6ccf9620SMasatake YAMATO }} 210*6ccf9620SMasatake YAMATO 211*6ccf9620SMasatake YAMATO --regex-<LANG>=<PATTERN>//LONGFLAGS...{{ 212*6ccf9620SMasatake YAMATO OPTSCRIPT CODE FRAGMENTS 213*6ccf9620SMasatake YAMATO }} 214*6ccf9620SMasatake YAMATO 215*6ccf9620SMasatake YAMATO --mline-regex-<LANG>=<PATTERN>/<NAME>/[<KIND>/]LONGFLAGS...{{ 216*6ccf9620SMasatake YAMATO OPTSCRIPT CODE FRAGMENTS 217*6ccf9620SMasatake YAMATO }} 218*6ccf9620SMasatake YAMATO 219*6ccf9620SMasatake YAMATO --mline-regex-<LANG>=<PATTERN>//LONGFLAGS...{{ 220*6ccf9620SMasatake YAMATO OPTSCRIPT CODE FRAGMENTS 221*6ccf9620SMasatake YAMATO }} 222*6ccf9620SMasatake YAMATO 223*6ccf9620SMasatake YAMATO --_mtable-regex-<LANG>=<TABLE>/<PATTERN>/<NAME>/[<KIND>/]LONGFLAGS...{{ 224*6ccf9620SMasatake YAMATO OPTSCRIPT CODE FRAGMENTS 225*6ccf9620SMasatake YAMATO }} 226*6ccf9620SMasatake YAMATO 227*6ccf9620SMasatake YAMATO --_mtable-regex-<LANG>=<TABLE>/<PATTERN>//LONGFLAGS...{{ 228*6ccf9620SMasatake YAMATO OPTSCRIPT CODE FRAGMENTS 229*6ccf9620SMasatake YAMATO }} 230*6ccf9620SMasatake YAMATO 231*6ccf9620SMasatake YAMATO --_list-operators 232*6ccf9620SMasatake YAMATO 233*6ccf9620SMasatake YAMATO --list-fields 234*6ccf9620SMasatake YAMATO 235*6ccf9620SMasatake YAMATOYou can run optscript code fragments when pattern specified with 236*6ccf9620SMasatake YAMATOoptions matches successfully. The options are ``--regex-<LANG>``, 237*6ccf9620SMasatake YAMATO``--mline-regex-<LANG>``, and ``--_mtable-regex-<LANG>`` as you 238*6ccf9620SMasatake YAMATOexpect. In addition, ``--_prelude-<LANG>`` and ``--_sequel-<LANG>`` 239*6ccf9620SMasatake YAMATOoptions also take code fragments. 240*6ccf9620SMasatake YAMATO 241*6ccf9620SMasatake YAMATOTBW: two timings of evaluation 242*6ccf9620SMasatake YAMATO 243*6ccf9620SMasatake YAMATOPut code fragments at the end of options with surrounding "``{{``" and 244*6ccf9620SMasatake YAMATO"``}}``". Though it is not impossible, a command line is not suitable 245*6ccf9620SMasatake YAMATOplace to put code fragments because the code fragments may be long. 246*6ccf9620SMasatake YAMATOInstead, you should write them to a .ctags file. 247*6ccf9620SMasatake YAMATO 248*6ccf9620SMasatake YAMATO.. warning:: An important rule in writing Optscript code in a file is 249*6ccf9620SMasatake YAMATO the start marker, ``{{`` must be at the end of line, and the end 250*6ccf9620SMasatake YAMATO marker ``}}`` must be at the beginning of line. If you break the 251*6ccf9620SMasatake YAMATO rule, the optlib loader of ctags fails to read your file. 252*6ccf9620SMasatake YAMATO 253*6ccf9620SMasatake YAMATO``--_prelude-<LANG>`` is for specified code fragments run at the 254*6ccf9620SMasatake YAMATObeginning of parsing a source file. You can use this option for 255*6ccf9620SMasatake YAMATOdefining the common code used in the parser. 256*6ccf9620SMasatake YAMATO 257*6ccf9620SMasatake YAMATO``--_sequel-<LANG>`` is for for specified code fragments run at the end 258*6ccf9620SMasatake YAMATOof parser a source file. You can use this option for debug-printing 259*6ccf9620SMasatake YAMATOthe final state of parsing the source file. 260*6ccf9620SMasatake YAMATOe.g. ``--_sequel-Foo={{ _traced { pstack } if }}``. 261*6ccf9620SMasatake YAMATO 262*6ccf9620SMasatake YAMATO``--_list-operators`` lists all operators (and built-in procedures) 263*6ccf9620SMasatake YAMATOand exits. In additions to operators defined in ``optscript``, 264*6ccf9620SMasatake YAMATO``ctags`` provides operators for tagging. 265*6ccf9620SMasatake YAMATO 266*6ccf9620SMasatake YAMATO``OP`` column of ``--list-fields`` represents the availability of 267*6ccf9620SMasatake YAMATOoperators for accessing the field specified in the line. ``r`` 268*6ccf9620SMasatake YAMATOrepresents the field has an operator for reading 269*6ccf9620SMasatake YAMATO(``:fieldname``). ``w`` represents the field has an operator for 270*6ccf9620SMasatake YAMATOwriting (``fieldname:``). 271*6ccf9620SMasatake YAMATO 272*6ccf9620SMasatake YAMATOOperators 273*6ccf9620SMasatake YAMATO............................ 274*6ccf9620SMasatake YAMATO 275*6ccf9620SMasatake YAMATO**.** -> ``-`` **.** ``corkIndex:int`` 276*6ccf9620SMasatake YAMATO 277*6ccf9620SMasatake YAMATO Push the cork index for the tag 278*6ccf9620SMasatake YAMATO 279*6ccf9620SMasatake YAMATO**\\n** -> ``-`` **\\n** ``matchedString:string`` 280*6ccf9620SMasatake YAMATO 281*6ccf9620SMasatake YAMATO ``n`` is an integer (0...9) representing a group in a pattern. 282*6ccf9620SMasatake YAMATO Push the matched string for the group. 283*6ccf9620SMasatake YAMATO 284*6ccf9620SMasatake YAMATO``_matchloc`` 285*6ccf9620SMasatake YAMATO 286*6ccf9620SMasatake YAMATO TBW 287*6ccf9620SMasatake YAMATO 288*6ccf9620SMasatake YAMATO``:field`` (See the output of ``--_list-operators``) 289*6ccf9620SMasatake YAMATO 290*6ccf9620SMasatake YAMATO Get the value for the specified field from a tag 291*6ccf9620SMasatake YAMATO and put it. 292*6ccf9620SMasatake YAMATO 293*6ccf9620SMasatake YAMATO``field:`` (See the output of ``--_list-operators``) 294*6ccf9620SMasatake YAMATO 295*6ccf9620SMasatake YAMATO Set a value at the stack to the specified field of a tag. 296*6ccf9620SMasatake YAMATO 297*6ccf9620SMasatake YAMATO``_tag`` 298*6ccf9620SMasatake YAMATO 299*6ccf9620SMasatake YAMATO TBW 300*6ccf9620SMasatake YAMATO 301*6ccf9620SMasatake YAMATO``_COMMIT`` 302*6ccf9620SMasatake YAMATO 303*6ccf9620SMasatake YAMATO TBW 304*6ccf9620SMasatake YAMATO 305*6ccf9620SMasatake YAMATO``_traced`` 306*6ccf9620SMasatake YAMATO 307*6ccf9620SMasatake YAMATO TBW 308*6ccf9620SMasatake YAMATO 309*6ccf9620SMasatake YAMATOData types 310*6ccf9620SMasatake YAMATO.......... 311*6ccf9620SMasatake YAMATO 312*6ccf9620SMasatake YAMATO``MATCHLOC`` 313*6ccf9620SMasatake YAMATO 314*6ccf9620SMasatake YAMATO TBW 315*6ccf9620SMasatake YAMATO 316*6ccf9620SMasatake YAMATO``index:int`` 317*6ccf9620SMasatake YAMATO 318*6ccf9620SMasatake YAMATO TBW 319*6ccf9620SMasatake YAMATO 320*6ccf9620SMasatake YAMATO``TAG`` 321*6ccf9620SMasatake YAMATO 322*6ccf9620SMasatake YAMATO TBW 323*6ccf9620SMasatake YAMATO 324*6ccf9620SMasatake YAMATORecipes 325*6ccf9620SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326*6ccf9620SMasatake YAMATO 327*6ccf9620SMasatake YAMATOTBW 328*6ccf9620SMasatake YAMATO 329*6ccf9620SMasatake YAMATODifference between Optscript and PostScript 330*6ccf9620SMasatake YAMATO~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331*6ccf9620SMasatake YAMATO 332*6ccf9620SMasatake YAMATO* Memory management 333*6ccf9620SMasatake YAMATO 334*6ccf9620SMasatake YAMATO* Dynamically extendable data type 335*6ccf9620SMasatake YAMATO 336*6ccf9620SMasatake YAMATO - string 337*6ccf9620SMasatake YAMATO 338*6ccf9620SMasatake YAMATO - array 339