IDLE: Unified W3-Access to Interactive Information Servers

Louis Perrochon, Institut für Informationssysteme, ETH Zürich, Switzerland.
perrochon@acm.org

Roman Fischer, Abteilung für Informatik ETH Zürich, Switzerland.
rofische@iiic.ethz.ch

Abstract
This paper focuses on the problem of accessing interactive information servers ("interactive sessions" in W3-terminology, e.g. an existing library information system) directly with a W3-browser instead of opening an additional viewer (e.g. a terminal emulation program). IDLE is a language designed to describe the user interface of interactive information servers in a way that allows automatic translation of W3-requests to server-commands. Interactive information servers described with IDLE can be accessed by any W3-browser via a special translation server. Describing the user interface of an interactive information server is typically much easier than designing a fully featured gateway for each service.
Keywords:
World-Wide Web (W3), translation servers, interactive sessions, user interface description language (IDLE).

1. Introduction

The World-Wide Web (W3) [Berners-Lee et al. 94] in its current state allows unified access to a multitude of information systems. However many information servers cannot be accessed by W3-browsers like Mosaic. Unlike the W3, they are based on stateful protocols that W3-browsers cannot handle. To allow W3-users access to these interactive information servers, special "document types" have been introduced and additional "viewers", in this case terminal emulation programs, are required.

In this paper we present another approach: Translation servers [Perrochon 94b] handle the translation from a stateless protocol like HTTP (Hypertext Transfer Protocol) into a stateful one that can be used by interactive information servers (e.g. VT-100, 3270). Translation servers can also transform hypertext-links to database queries and the query results back to hypertext. To communicate with an interactive information server, the translation server accesses the same user interface as any human does [Perrochon 94b] (Fig. 1).

Translation Server Overview

Fig 1. Translation server as intermediary.

Generic translation servers are able to access different interactive information servers. To achieve this, the user interface of an interactive information server is described in a formal way. This paper proposes a simple user interface description language (IDLE, Interface Description LanguagE) useful to describe a whole range of servers. Information servers described with IDLE can directly be accessed by W3-browsers using HTTP and a translation server. The language IDLE allows the programmer to concentrate on the hard part of the task: automating the user interaction required to fetch useful data from an interactive information server. All low level aspects of communication with both the server and the browser are completely hidden from the IDLE programmer.

The structure of this paper is as follows: in Section 2 we will define the notion of states and some other terms and we also will refer to related work. In Section 3 IDLE is introduced. Section 4 discusses some implementation aspects, while Section 5 presents a short example. The paper ends with a summary and some future-oriented thoughts. An EBNF-like description of IDLE can be found in the appendix.

2. Definitions and Related Work

2.1 Definitions

Information server: "An information server is a central computer system providing information on demand to remote users." We use the term information server for the computer and the program running on it. This definition is intended to include traditional systems that are accessed by terminal emulation programs as well as newer systems like W3-servers. Interactive information servers are those accessed by terminal emulation programs. They are called "interactive", because one session consists of an iterative, dialogue-like interaction between the user and the server. Non-interactive information servers (like W3-server) work on a request-response base. They do not request dialogue-like interactions.

Browser (or client): Similar to a terminal emulation program that accesses an interactive information server, a browser accesses a non-interactive information server. Mosaic is the most famous browser used to access W3-servers.

State: [Comer et al. 94] defines: "Information that a server maintains about the status of ongoing interactions with clients is called state information. Servers that do not keep any state information are called stateless servers; others are called stateful servers". State information includes all stored state variables and their values. An individual set of values defines a state. A server is said to change its state whenever the values of its state variables change.

A stateless server always accepts the same set of requests from clients and its reaction solely depends on the commands given. A stateful server can assume several different states; it changes its state depending on the previous commands. In addition, requests are always interpreted depending on the current state. Whether a server is stateless or stateful depends also on the communication protocol used. A stateless server cannot function with a protocol that makes the meaning of a message depend on a previous message. Typically, an interactive information server is stateful. Examples: W3-servers are stateless (apart from collecting statistical information), library information systems and similar information servers accessed with telnet are stateful servers.

"Interactive information server" and "stateful information server" are synonyms. The former focuses on the interaction with the user, the latter on the server itself. We prefer the term interactive information server, because it is close to "interactive service", another synonymous notion that is frequently used in the W3-context.

2.2 Related Work

The translation server approach differs from previous solutions, such as those discussed in the workshop "Offering the same information via multiple services" of the First World-Wide Web Conference in Geneva [WWW'94]. One typical example is the CUBAI-project [CUBAI] which offers uniform access to several astronomical libraries: To join the project, library providers have to export their data in a "common format" which is then processed by WAIS [WAIS] and made available using a W3-to-WAIS gateway. Another proposed solution is to replace an existing application (but not the data) with a special purpose W3-server ("Gateways" in the W3-terminology) [Eichmann et al. 94], [Putz 94]. Because with our approach the data provided by the information server is not accessed directly but via the existing user interface, there is neither any need to reverse-engineer the data-structure, nor to transform, nor to copy it.

3. IDLE - A Simple Interface Description Language

Generic translation servers should be able to access a multitude of different information servers. To achieve this, we define a special user interface description language (IDLE) that can be used to describe any textbased user interface of existing interactive information servers. The translation server interprets the formal interface description while accessing the information server.

There exist many scripting languages for manipulation character strings, such as Perl or awk. IDLE's regular expressions provides the same string matching functionality. In addition is has special functions that handle communication with both the information server and the browser.

Because IDLE programs are neither very large nor very complex, no support for modularization and abstract data types or object-oriented programming is given. An EBNF like definition of the language can be found in the appendix.

3.1 Variables and Functions

In IDLE the communication with the interactive information server is very simple. The connection to the server is modelled as a duplex character-stream, flowing to and from the server respectively. As we are only dealing with textbased user interfaces, we need basically only one data type: String. Often more than one substring has to be extracted from the character-stream flowing from the server. To simplify the handling of an a priory unknown number of similar strings, all variables in IDLE are "lists of character strings". Another data type, called single strings, exists only in the form of string constants (e.g. "hello") and during the evaluation of an expression. (E.g. LEFTOF (foo, FIRST (bar) which takes the first string of the list of bar. This single string is used as a search pattern on all the strings of foo. Only the strings of foo that match the pattern, and only the characters left of the pattern are copied to the resulting string list.) As basically only one data type is supported, there is no need to declare variables before using them. When evaluating an expression, every name is considered as the name of an existing variable. When no variable with this name can be found, a new one is allocated and initialized.

For manipulating string lists and single strings, many functions are defined:

var := expr
Assignment: The expression expr is evaluated and the resulting string list is copied to var. If var already exists, its previous contents are destroyed.
ADD (expr1, expr2)
The string list of expr2 is appended at the end of the string list of expr1. As we are handling lists, duplicates are not removed.
DEL (expr1, expr2)
All strings of expr2 which also are in expr1 are deleted from expr1. (For sets, this is also called "asymmetric set difference".)
FIRST (expr)
Returns the first string of expr. If expr is an empty list, FIRST returns an empty string.
LAST (expr)
Same as FIRST but returns the last string of expr.
CONCAT (expr, str)
The string str is appended to all strings in expr.
RIGHTOF (expr, str)
All strings of expr are searched for str. If str matches a string of expr, all characters right of the occurrence of str are copied to the result. If a string of expr does not match str, it will not be copied to the result.
LEFTOF (expr, str)
All strings of expr are searched for str. If str matches a string of expr, all characters left of the occurrence of str are copied to the result. If a string of expr does not match str, it will not be copied to the result.
BETWEEN(expr,str,str)
Same as RIGHTOF and LEFTOF, but all characters between the two search strings are copied to the result.

3.2 Searching Strings and Variables (Regular Expressions)

Whenever a string list is scanned for a string, the matching is done using a regular expression algorithm. Therefore, certain characters control the behaviour of the searching algorithm instead of being part of the search pattern. The following characters have special meanings in regular expressions:
"+"
One or more repetitions of the preceding regular expression.
"?"
The preceding regular expression is optional.
"*"
Any number (0..n) of repetitions of the preceding regular expression.
"."
Matches any character.
"(", ")"
Groups a subexpression.
"|"
Alternation. Either the regular expression to the left or the regular expression to the right may match.
"[", "]"
Range. Matches one character out of the specified range or character class. Ranges are written as "[a-z]". Defined character classes are: alpha, upper, lower, alnum, xdigit, space, print, punct, graph, cntrl, blank. Character classes are written as [:name:].
To search for characters having special meanings in regular expressions, the "\" escape-notation has to be used (e.g. search for an asterisk: "\*"). For searching a "\" simply write "\\". All string matching is strictly done from left to right. This also holds for RIGHTOF.

3.3 Notes on IDLE Semantics

Backphases (BP) and Frontphases (FP)

The description of the user interface of an interactive information server consists of a sequence of phases. Backphases (BP) control the interactions with the server, while frontphases (FP) control the communication with the user (typically the user interacts with a W3-browser, which itself interacts with the translation server, which interprets an IDLE program).

An IDLE program must follow the simple rule, that FP and BP alternate (Fig. 2)! It is therefore forbidden to use a BACK statement in a BP or to use a FRONT statement in a FP. Execution of an IDLE program always begins with the start-phase (i.e. the one named START). An IDLE program terminates when it reaches the end of a phase before reaching a FRONT or BACK statement.

Note that the FRONT and BACK statements are in fact jumps or mode switches to the respective phases rather than subroutine calls. When executing a FRONT or BACK statement, the current phase is terminated and the next phase is started. Jumps can also go backwards to previous phases.

Basic
Mechanism

Fig. 2 Basic mechanism of a translation server.

The Errophase (EP)

An EP has two parts: The first part is a sequence of special commands to set time-out-values and alike (errstm). These commands are interpreted before execution of the START-phase. The second part is a statement sequence (stmseq) grouped between BEGIN and END. This stmseq is only executed after an error occurred. The following special commands are defined for the first part of an EP:
ERROR READ/OPEN
You can specify pairs of (errorsymptom, id) to catch typical error messages generated by the server. Every OPEN and READ statement will watch for the symptoms while they execute. If a symptom is found, the variable IDLE_ERROR receives the appropriate id and the statements after the BEGIN in the EP are executed. Note that specifying too many errorsymptoms will slow down the processing of READ statements.
TIMEOUT FRONT
sets the number of seconds a PAGE statement will wait for an answer (i.e. a follow-up request from the user), before it gives up.
TIMEOUT BACK
sets the number of seconds an OPEN or READ statement will wait to succeed before giving up.
When an error or a time-out occurs the corresponding identifier will be placed in the system variable IDLE_ERROR. The statements in the errorphase after the BEGIN can then query this variable to determine the cause of the error.

Note: The EP is not yet implemented in the current version of the translation server.

OPEN / CLOSE / READ / WRITE

These statements provide an easy way to handle streams. The language allows having multiple streams open at the same time. The different streams can be labelled with a file identifier (a number). However the file identifier will not be needed if only one connection is open at a time. When executing a READ statement either COUNT or UPTO has to be specified COUNT reads the specified number of characters, UPTO reads until the specified pattern appears. Note that READ stops after meeting the specified condition. Due to the way strings are handled, READ UPTO ignores Null bytes! However READ COUNT does not ignore them and reads exactly the specified number of bytes.

IF condition THEN stmseq [ELSE stmseq] END

This statement provides the standard conditional execution of statements. The condition can be one of three relations:
"expr1 = expr2"
Both string lists must be the same. This means that all the strings must be the same and the order of the strings must be the same.
"expr1 # expr2"
Contrary of "=": the relation yields TRUE when one or more strings are different.
"expr CONTAINS str"
Yields TRUE if str matches any string of expr.

FOREACH var IN expr DO

FOREACH is an iterator. The expression is evaluated and the statements between the DO and END are executed for every string of the stringlist expr. The variable var holds the string for which the loop is currently executed. Var always represents a list with just one string.

WHILE condition DO stmseq END

The statements in the WHILE-body are executed while the condition in the WHILE-head holds.

PRINT

PRINT provides an easy way of logging events and printing information for the operator of the translation server. The strings in expr are copied to STDOUT.

RESUME

This statement is allowed only in an errorphase. A RESUME statement terminates the execution of the errorphase and continues at the location where the error occurred.

Comments

Comments are enclosed in "(*" and "*)". Nested comments are allowed.

3.5 The PAGE Statement

The PAGE statement is aimed at shielding all the interaction with different browsers and protocols (on the browser side of the translation server) from the programmer of an interface description. PAGE statements are allowed in frontphases only. All of the so-called OUTPUT and INPUT statements in a PAGE statement are gathered together, and they define a single interaction with the user. If the PAGE-statement contains no input fields it will not (have to) wait for a user-response.

INPUT incontrol argpairs

The input incontrols have the following meanings:
STRING
The user is prompted for a string. The user may enter any string (including linefeeds, etc.).
PASSWORD
Same as STRING, but the characters are not shown in the entry-field.
MENU
The prompt strings are displayed in a menu among which the user is supposed to select one. The identifier of the selected menu item is returned.
RADIO
Radio buttons are used to create fields of mutually exclusive items of which the user can select one. The identifier of the selected button is returned.
CHECK
Similar to radio buttons, but allows multiple items to be selected. The identifiers of all the selected boxes are returned.
REF
The strings in the argpairs are displayed as hypertext-links to further information. If the user selects a link the identifier of that link is returned by INPUT. In contrast to the other input control elements, when the user selects a hyper-link, the selection is immediately returned. For all the other control elements, the user has to press a "submit"-button first.
Every INPUT statement can hold several entries (argpairs). Every entry consists of an (expr, string) pair. The strings of the expr will form the prompt-text of that INPUT element. The string will be used as the identifier of the INPUT field. INPUT fields of type STRING and PASSWORD return the entered string rather than the field-identifier.

Note: If several INPUT statements put their results into the same variable, the returned strings will be combined in a list. The order of the INPUT statements in the PAGE description defines the order of the returned strings.

OUTPUT outcontrol expr

With the OUTPUT statement the IDLE programmer can easily transfer data (either written as text in the IDLE program, or resulting from the evaluation of any expression) to the user. It is possible to read data into a variable during a backphase and bring it to the user with an OUTPUT statement in the next frontphase. The outcontrols have the following meaning:
TITLE
If this control occurs in the first OUTPUT-statement of a PAGE-statement, the expression will become the title of the page presented to the user.
HEADER
The HEADER flag allows placing headings on the PAGE. Currently, six different levels of headings are defined in IDLE (refer to the [HTML] documentation for further details).
PREDEFINED
The expression will not be formatted by the browser. A fixed width font will be used to display the text.

4. Implementation Aspects

Implementation alternatives for translation servers have been discussed in [Perrochon 94b]. In this chapter some implementation decisions in connection with the IDLE-definition are presented. One of the goals was to use as much of existing programs as possible. For simplicity, we chose Unix as the target operating system for our translation server. We decided to base on the Common Gateway Interface [CGI]. As CGI is supported by many of the available W3-servers (i.e. HTTP-daemons), this solution will work with most existing servers.

4.1 Staying alive to keep connections open

Because the IDLE programmer normally wants to keep the connection to an information server open during the whole session, the translation server should not close the connection after a backphase. If a translation server is implemented without further precaution with CGI, it would be restarted for every single request, e.g. it would terminate in the middle of every frontphase and would restart when the next request from the user arrives, thus losing contact with the information server.

Our solution is a small "starter-program". This program merely establishes a communication channel between the W3-Server and the translation server. When a request is served, the "starter-program" terminates and the translation server stays alive. This concept allows the translation server to keep communication channels open as long as needed. An alternative would be to modify an existing W3-Server to pass "special requests" directly to the translation server. This would restrict the translation server to run with a so-patched W3-Server only. This is not acceptable.

4.2 State Information

One of the problems discussed in [Perrochon 94b] was the question of how and where to store state information of the translation server itself between different requests. We had the choice between storing all state-information in a database or creating a new process for every ongoing interaction between a user and an information server. Storing the state-information implicitly in the process that interprets the interface description has considerable advantages over the database solution:

4.3 Parsing IDLE

Of course, the ability to read and understand interface descriptions written in IDLE is one of the key aspects of a translation server. IDLE is not compiled but interpreted by the translation server. This approach was chosen because efficiency inside the translation server is not a key issue. The delays caused by communication are several orders of magnitude higher. The parser of the translation server was generated with the help of a compiler-compiler. Given a formal description of the language and some additional program-code, the compiler-compiler produces an IDLE-parser. Using a compiler-compiler substantially cuts down the implementation time needed for programming a translation server.

5. An Example: SVI-Kurs

In this chapter a commented example of an interface description using IDLE is presented. The service described is SVI-Kurs, a public information system storing dates and topics of conferences, tutorials and other activities of the Swiss computer professionals organisations. The existing interface allows browsing through the courses by date or organizer (Fig 3). This example is selected here because of its simplicity. However, still, not all details can be included here. Prototypes accessing SVI-Kurs and other information servers are available via the translation server project homepage.

Screen Shot

Fig. 3 Screen shot of existing Interface of SVI-Kurs.

FRONTPHASE START
BEGIN
    PAGE
        OUTPUT HEADER 1 "SVI-Kurs";
        OUTPUT "Select an access method:";
        INPUT RADIO 
         ("By Society", "1", "By Subject", "2",
         "By Date", "3", "All events", "4") INTO sel;
    END;
    IF sel = "1" THEN BACK soc END;
    IF sel = "2" THEN BACK subj END;
    IF sel = "3" THEN BACK date END;
    IF sel = "4" THEN BACK all END;
END

<HTML>
<HEAD> <TITLE>SVI-Kurs</TITLE></HEAD>
<BODY>
<FORM method="POST" action="/cgi-bin/svi_kurs">
<H1>SVI-Kurs</H1>
Select an access method:<p>
By Society<input name=sel type=radio value=1>
By Subject<input name=sel type=radio value=2> 
By Date<input name=sel type=radio value=3>
All events<input name=sel type=radio value=4>
<p>
<input type="submit" value="Submit">
</form>
Tab. 1 Frontphase START and its corresponding HTML-document.

The interface description of SVI-Kurs starts with a frontphase, requesting more information from the user (Fig. 4). In the PAGE statement, the user is offered four different access methods. If the user selects one of the choices, this selection is stored in the variable sel. Depending on the result a backphase is then selected. The whole interaction with the user, i.e. waiting for the initial user contact, preparing of HTML-pages, sending this page to the user, waiting for an answer, checking all follow-up requests to the same site for the answer from the same user and finally parsing this follow-up request for the necessary data, everything is done by the translation server.

Screen Shot

Fig. 4 Result of frontphase START on a W3-browser.

Let us assume now that, the user wants to see all the events and courses stored in the system. Then the translation server will start backphase all.

BACKPHASE all
BEGIN
    OPEN PORT "ezinfo.ethz.ch" 23; (* login to SVI-Kurs *)
    WRITE "\r\n";
    READ UPTO "Username:";
    WRITE "GAST\r\n";
    READ UPTO "ezinfo>";
    WRITE "EXT SVI\n";
    READ UPTO "22;3H>";    (* Prompt of SVI-Kurs *)
    WRITE sel;    (* Forward the user selection *) 
    
    n := "";
    info := "";
    id := "";
    READ UPTO "(";
    READ COUNT 1 INTO c;
    WHILE c # "E" DO (* Now start to fetch data *)
        IF c = "N" THEN
            READ UPTO ">";
            WRITE "N";
            n := CONCAT (n, "N");
        ELSE 
            IF c # "M" THEN
                READ COUNT 3;
                READ UPTO "\n" INTO line;
                info := ADD (info, CONCAT (CONCAT (line, "!"), CONCAT (n, FIRST(c))));
                id := ADD (id, CONCAT (n, FIRST (c)));
            END;
        END;
        READ UPTO "(";
        READ COUNT 1 INTO c;
    END;
    WRITE "M";
    READ UPTO ">";

    FRONT all_out;    
END
Tab.2 Backphase all.

Only now the translation server opens a connection to the information server, goes through the login procedure and gets the necessary data. The data is then temporarily stored in a variable info. Finally, the next frontphase all_out is called.

FRONTPHASE all_out
BEGIN
    PAGE
        OUTPUT HEADER 1 "List of all Events";
        FOREACH x IN info DO
            text := LEFTOF (x, "!");
            id   := RIGHTOF (x, "!");
            INPUT REF (text, id) INTO sel;
        END;
    END;
    BACK all_getitem;
END

<HTML>
<HEAD> <TITLE>SVI-Kurs</TITLE> </HEAD>
<BODY>
<H1>List of all Events</H1>
<ul>
...
<li>
<a href="/cgi-bin/svikurs2/SEQ=2/sel=N3">19.01.95 :
Workgroup und Workflow</a>
...
</ul>
</BODY>
Tab. 3 Frontphase all_out and its corresponding HTML-document.

This frontphase extracts the data from the variable info and sends a page to the user (Fig. 5). In this case, the page consists of a list of hypertext-links of which the user can select one. All this is invisible for the IDLE programmer. If the user selects one of the links, the translation server will eventually resume its operation with the next backphase, the variable sel then contains the identifier of the selected link. Note that in this case the user will have to select between hypertext-links. He or she does not have to push a "submit"-button after the selection.

Screen Shot

Fig. 5 Result of frontphase all_out on a W3-browser.

BACKPHASE all_getitem
BEGIN
    WHILE sel # "" DO
        IF sel = "[0..9]" THEN (*First navigate to the right place *)
            WRITE sel;
            sel := "";
        ELSE
            WRITE "N";
            READ UPTO ">";
            sel := RIGHTOF (sel, "N");
        END;
    END;
    READ COUNT 23;
    READ UPTO "23;33]" INTO kurs; (* get the data *)
    kurs := LEFTOF (kurs, "23;33]");

    WRITE "M";
    READ UPTO ">";

    FRONT all_showitem;
END
Tab.4 Backphase all_getitem.

In this phase, additional data for the selected course are fetched from the information server. Note that in the meantime, the translation server holds the connection open, so additional information can be read from the stream.

FRONTPHASE all_showitem
BEGIN
  PAGE
   OUTPUT HEADER 1 "Selected SVI-Kurs";
   OUTPUT PREDEFINED kurs;
  END;
  CLOSE;
END

<HTML>
<HEAD><TITLE>SVI-Kurs</TITLE></HEAD><BODY>
<H1>Selected SVI-Kurs</H1><PRE>
Tagung Workgroup und Workflow
19.01.95, Zuerich
H.Gonzenbach, P.H. Albrecht
SVD-Mitglieder Fr. 300.- Uebrige Teilnehmer Fr. 540.-
SVD, Postfach 373, 8037 Zuerich, Tel. 057 33 37 05
</PRE></BODY>
Tab.5 Frontphase all_showitem and its corresponding HTML-document.

The final frontphase puts the detailed information concerning the selected course into another page and sends it back to the user (Fig. 6).

Screen Shot

Fig. 6 Result of frontphase all_showitem on a W3-browser.

Other interactive information servers described with IDLE include information servers with the research-projects of ETH Zürich, the books of the library of the computer science department of ETH Zürich and the Swiss Constitution. The description of each interface took an experienced IDLE-programmer a few hours.

6. Summary

We presented the interpreted language IDLE used to formally describe the user interface of interactive information servers. Such descriptions can be read by a translation server which integrates the interactive information server homogeneously into the universal context of objects as defined in the W3 context. As translation servers access a server via the original user interface designed for human users, no direct access to the data of the server takes place. It is thus not necessary to reverse-engineer, transform or copy existing data on the server. All low-level aspects of communication are shielded from the IDLE programmer. This makes it very simple to add existing services to the W3.

In the near future, translation servers will be able to bridge the gap between stateful and stateless information systems. Translation Servers are well suited to access existing stateful information servers [Perrochon 94a]. We believe in the power of stateless protocols for information services. However, also in the long range, for certain tasks, e.g. complex systems and well trained users, stateful protocols are better suited. Thus some systems will remain stateful. In this situation, translation servers or similar concepts allow untrained users to access at least a subset of the functionality of the whole system.

Appendix - IDLE Definition

This is an EBNF like definition of the IDLE language. For explanations see section 3.
ID         =  [ errorphase ] {(BACKPHASE | FRONTPHASE) 
              name BEGIN stmseq END }.
stmseq     =  stm { ";" stm }.
stm        =  ( var ":=" expr )                                 |
              ( OPEN [ fileid ](FILE string | PORT string num)) |
              ( CLOSE [ fileid ] )                              |
              ( WRITE [ fileid ] (expr | NULLBYTE) )            |
              ( READ [ fileid ]
                ( COUNT num | UPTO expr )[ INTO var ] )         |
              ( IF condition THEN stmseq [ ELSE stmseq ] END )  |
              ( FOREACH var IN expr DO stmseq END )             |
              ( WHILE condition DO stmseq END )                 |
              ( PAGE stmseq END )                               |
              ( OUTPUT [outcontrol] expr )                      |
              ( INPUT incontrol argpairs INTO var )             |
              ( PRINT expr )                                    |
              ( BACK name )                                     |
              ( FRONT name )                                    |
              RESUME.
outcontrol =  TITLE | ( HEADER [1-6] ) | PREDEFINED.
incontrol  =  STRING | PASSWORD | MENU | CHECK | RADIO | REF.
errorphase =  ERRORPHASE errorseq BEGIN stmseq END.
errorseq   =  errstm { ";" errstm }.
errorstm   =  ( TIMEOUT (FRONT | BACK) "(" num "," string ")" ) |
              ( ERROR (READ | OPEN)  argpairs ).
condition  =  ( expr relation expr ) | ( expr CONTAINS string ).
relation   =  "=" | "#".
expr       =  var | string | function.
function   =  ( ( ADD | DEL ) arg2e )                           |
              ( (CONCAT | RIGHTOF | LEFTOF) arg2s )             |
              ( BETWEEN arg3) .
string     =  text | ( ( FIRST | LAST ) arg1 ).
arg1       =  "(" expr ")".
arg2e      =  "(" expr "," expr ")".
arg2s      =  "(" expr "," string ")".
arg3       =  "(" expr "," string "," string ")".
argpairs   =  "(" string "," string 
              { "," string "," string } ")".
fileid     =  num.
var        =  name.
name       =  [a-zA-Z_] { [a-zA-Z0-9_] }.
num        =  { [0-9] }.
text       =  '"' { character } '"'.
comment    =  "(*" { character } "*)".
Character stands for any ASCII-Character. Nonprintable characters (and double quotes) need to be written as "\nnn" or "\xhh". Where "nnn" is the octal and "hh" the hexadecimal ASCII-Code of the character.

7. References

[Berners-Lee et al. 94]
Berners-Lee, T. Cailliau, R., Luotonen, A., Nielsen, H. F., Secret, A. The World-Wide Web. Communication of the ACM. Volume 37, Number 8, August 1994.
[CGI]
The Common Gateway Interface. See http://hoohoo.ncsa.uiuc.educgi/overview.html
[Comer et al. 94]
Comer, Douglas E., Stevens, David L. Internetworking with TCP/IP Volume III. Client-server programming and applications: Prentice-Hall. 1994. ISBN 0-13-474230-3
[CUBAI]
Balestra, A., Ferruci, M. Accessing Libraries in a Uniform Way: The CUBAI Project. An abstract is published in Computer Networks and ISDN Systems, Vol. 27 (1994), Number 2, November 1994. The service itself can be reached on http://www.oat.ts.astro.it/iblio/biblio.html
[Eichmann et al. 94]
Eichmann, D., McGregor, T., Danley, D. Integrating structured databases into the Web: The MORE system. The First International Conference on the World-Wide Web (WWW'95), May 25-27, 1994, CERN, Geneva. Published in Computer Networks and ISDN Systems Vol. 27 (1994), Number 2, November 1994, pp 281-288.
[HTML]
The Hypertext Markup Language. See http://info.cern.ch/ypertext/WWW/MarkUp/MarkUp.html
[HTTP]
The Hypertext Transfer Protocol. See http://info.cern.ch/hypertext/WWW/Protocols/HTTP/HTTP2.html
[Perrochon 94a]
Perrochon, L. Multiple Service Integration Confronted With Legacy Systems. Workshop "Offering the Same Information via Multiple Services" of the WWW'94, May 1994, CERN, Geneva. (PostScript or HTML at ftp://ftp.inf.ethz.ch/pub/publications/papers/s/ea/www94.(ps|html))).
[Perrochon 94b]
Perrochon, L. Translation Servers: Gateways between Stateless and Stateful Information Systems. Network Service Conference (NSC'94), November 28-30, 1994, London. (PostScript or HTML at ftp://ftp.inf.ethz.ch/pub/publications/papers/s/ea/nsc94.(ps|html))).
[Putz 94]
Putz, S. Interactive information services using World-Wide Web hypertext. The First International Conference on the World-Wide Web (WWW'95), May 25-27, 1994, CERN, Geneva. Published in Computer Networks and ISDN Systems Vol. 27 (1994), Number 2, November 1994, pp 273-280.
[WAIS]
Wide Area Information System. See http://info.cern.ch/hypertext/Products/WAIS/Overview.html
[WWW'94]
The First International Conference on the World-Wide Web, May 1994, CERN, Geneva. Selected papers and abstracts of the workshops are published in Computer Networks and ISDN Systems, Vol. 27 (1994), Number 2, November 1994. See also http://www1.cern.ch/WWW94/Welcome.tml
The translation server project homepage is http://www.inf.ethz.ch/department/IS/ea/tsp/. It offers updated information about the progress of the whole project as well as links to publications, prototypes and tools.