xref: /Universal-ctags/docs/optscript.rst (revision 6ccf9620e01cba27b933d65ca5983760a04f4834)
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