summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/otps/otp-parser.y
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/otps/otp-parser.y')
-rw-r--r--Build/source/texk/web2c/otps/otp-parser.y331
1 files changed, 331 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/otps/otp-parser.y b/Build/source/texk/web2c/otps/otp-parser.y
new file mode 100644
index 00000000000..468b0557930
--- /dev/null
+++ b/Build/source/texk/web2c/otps/otp-parser.y
@@ -0,0 +1,331 @@
+/* otp.y: Grammar for OTP files.
+
+This file is part of Omega,
+which is based on the web2c distribution of TeX.
+
+Copyright (c) 1994--2001 John Plaice and Yannis Haralambous
+Copyright (C) 2005, 2006 Roozbeh Pournader
+
+Omega is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+Omega is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Omega; if not, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+%{
+#include "otp.h"
+#include "routines.h"
+#include "yystype.h"
+int k, len;
+
+static void
+yyerror(const char *msg)
+{
+fprintf(stderr, "line %d: %s\n", line_number, msg);
+}
+%}
+
+%token NUMBER
+%token ID
+%token STRING
+%token LEFTARROW
+%token RIGHTARROW
+%token INPUT
+%token OUTPUT
+%token ALIASES
+%token STATES
+%token TABLES
+%token EXPRESSIONS
+%token PUSH
+%token POP
+%token DIV
+%token MOD
+%token BEG
+%token END
+
+%left '+' '-'
+%left '*' DIV MOD
+
+%%
+
+File :
+ Input
+ Output
+ Tables
+ States
+ Aliases
+ Expressions
+ ;
+
+Input :
+ /* Empty */
+ { input_bytes=2; }
+ | INPUT NUMBER ';'
+ { input_bytes=$2.yint; }
+ ;
+
+Output :
+ /* Empty */
+ { output_bytes=2; }
+ | OUTPUT NUMBER ';'
+ { output_bytes=$2.yint; }
+ ;
+
+Tables :
+ /* Empty */
+ | TABLES MoreTables
+ ;
+
+MoreTables :
+ OneTable
+ | MoreTables OneTable
+ ;
+
+OneTable :
+ ID '[' NUMBER ']'
+ { store_table($1.ystring, $3.yint); }
+ '=' '{' Numbers '}' ';'
+ ;
+
+Numbers :
+ /* Empty */
+ | MoreNumbers
+ ;
+
+MoreNumbers :
+ NUMBER
+ { add_to_table($1.yint); }
+ | MoreNumbers ',' NUMBER
+ { add_to_table($3.yint); }
+ ;
+
+States :
+ /* Empty */
+ | STATES MoreStates ';'
+ ;
+
+MoreStates :
+ ID
+ { store_state($1.ystring); }
+ | MoreStates ',' ID
+ { store_state($3.ystring); }
+ ;
+
+Aliases :
+ /* Empty */
+ | ALIASES MoreAliases
+ ;
+
+MoreAliases :
+ OneAlias
+ | MoreAliases OneAlias
+ ;
+
+OneAlias :
+ ID '=' OneCompleteLeft ';'
+ { store_alias($1.ystring, $3.yleft); }
+ ;
+
+OneCompleteLeft :
+ STRING
+ { $$.yleft = StringLeft($1.ystring); }
+ | OneLeft '<' NUMBER ',' NUMBER '>'
+ { $$.yleft = CompleteLeft($1.yleft, $3.yint, $5.yint); }
+ | OneLeft '<' NUMBER ',' '>'
+ { $$.yleft = PlusLeft($1.yleft, $3.yint); }
+ | OneLeft '<' NUMBER '>'
+ { $$.yleft = CompleteLeft($1.yleft, $3.yint, $3.yint); }
+ | OneLeft
+ { $$.yleft = $1.yleft; }
+ ;
+
+OneLeft :
+ NUMBER
+ { $$.yleft = SingleLeft($1.yint); }
+ | NUMBER '-' NUMBER
+ { $$.yleft = DoubleLeft($1.yint, $3.yint); }
+ | '.'
+ { $$.yleft = WildCard(); }
+ | '^' '(' ChoiceLeft ')'
+ { $$.yleft = NotChoiceLeft($3.ylleft); }
+ | '(' ChoiceLeft ')'
+ { $$.yleft = ChoiceLeft($2.ylleft); }
+ | '{' ID '}'
+ { $$.yleft = lookup_alias($2.ystring); }
+ ;
+
+ChoiceLeft :
+ OneLeft
+ { $$.ylleft = llist1($1.yleft); }
+ | ChoiceLeft '|' OneLeft
+ { $$.ylleft = lappend1($1.ylleft, $3.yleft); }
+ ;
+
+Expressions :
+ EXPRESSIONS MoreExpressions
+ {
+ for(cur_state=0; cur_state<no_states; cur_state++) {
+ if ((states[cur_state].no_exprs)==0) {
+ out_int(OTP_LEFT_START, 0);
+ } else {
+ out_int(OTP_LEFT_RETURN, 0);
+ }
+ out_int(OTP_RIGHT_CHAR, 1);
+ out_int(OTP_STOP, 0);
+ }
+ }
+ ;
+
+MoreExpressions :
+ OneExpr
+ | MoreExpressions OneExpr
+ ;
+
+OneExpr :
+ LeftState
+ { states[cur_state].no_exprs++; }
+ TotalLeft
+ { out_left($3.ylleft); right_offset=0; }
+ RIGHTARROW Right
+ { right_offset=OTP_PBACK_OFFSET; }
+ PushBack RightState ';'
+ { fill_in_left(); }
+ ;
+
+PushBack :
+ /* Empty */
+ | LEFTARROW Right
+ ;
+
+LeftState :
+ /* Empty */
+ { cur_state = 0; }
+ | '<' ID '>'
+ { cur_state = lookup_state($2.ystring); }
+ ;
+
+TotalLeft :
+ BegLeft Left EndLeft
+ { $$.ylleft = lappend($1.ylleft, lappend($2.ylleft, $3.ylleft)); }
+| BegLeft EndLeft
+ { $$.ylleft = lappend($1.ylleft, $2.ylleft); }
+ ;
+
+BegLeft :
+ /* Empty */
+ { $$.ylleft = nil; }
+ | BEG
+ { $$.ylleft = llist1(BeginningLeft()); }
+ ;
+
+EndLeft :
+ /* Empty */
+ { $$.ylleft = nil; }
+ | END
+ { $$.ylleft = llist1(EndLeft()); }
+ ;
+
+Left :
+ OneCompleteLeft
+ { $$.ylleft = llist1($1.yleft); }
+ | Left OneCompleteLeft
+ { $$.ylleft = lappend1($1.ylleft, $2.yleft); }
+ ;
+
+Right :
+ /* Empty */
+ | Right OneRight
+ ;
+
+OneRight :
+ STRING
+ {
+ len=strlen($1.ystring);
+ for (k=0; k<len; k++) {
+ out_right(OTP_RIGHT_NUM, ($1.ystring)[k]);
+ }
+ }
+ | NUMBER
+ { out_right(OTP_RIGHT_NUM, $1.yint); }
+ | '\\' NUMBER
+ { out_right(OTP_RIGHT_CHAR, $2.yint); }
+ | '\\' '$'
+ { out_right(OTP_RIGHT_LCHAR, 0); }
+ | '\\' '(' '$' '-' NUMBER ')'
+ { out_right(OTP_RIGHT_LCHAR, $5.yint); }
+ | '\\' '*'
+ {
+ out_right(OTP_RIGHT_SOME, 0);
+ out_int(0,0);
+ }
+ | '\\' '(' '*' '+' NUMBER ')'
+ {
+ out_right(OTP_RIGHT_SOME, $5.yint);
+ out_int(0, 0);
+ }
+ | '\\' '(' '*' '-' NUMBER ')'
+ {
+ out_right(OTP_RIGHT_SOME, 0);
+ out_int(0, $5.yint);
+ }
+ | '\\' '(' '*' '+' NUMBER '-' NUMBER ')'
+ {
+ out_right(OTP_RIGHT_SOME, $5.yint);
+ out_int(0, $7.yint);
+ }
+ | '#' OneRightExpr
+ { out_right(OTP_RIGHT_OUTPUT, 0); }
+ ;
+
+RestRightExpr :
+ OneRightExpr
+ | RestRightExpr '+' OneRightExpr
+ { out_int(OTP_ADD, 0); }
+ | RestRightExpr '-' OneRightExpr
+ { out_int(OTP_SUB, 0); }
+ | RestRightExpr '*' OneRightExpr
+ { out_int(OTP_MULT, 0); }
+ | RestRightExpr DIV OneRightExpr
+ { out_int(OTP_DIV, 0); }
+ | RestRightExpr MOD OneRightExpr
+ { out_int(OTP_MOD, 0); }
+ | ID
+ { out_int(OTP_PUSH_NUM, lookup_table($1.ystring)); }
+ '[' RestRightExpr ']'
+ { out_int(OTP_LOOKUP, 0); }
+ ;
+
+OneRightExpr :
+ NUMBER
+ { out_int(OTP_PUSH_NUM, $1.yint); }
+ | '\\' NUMBER
+ { out_int(OTP_PUSH_CHAR, $2.yint); }
+ | '\\' '$'
+ { out_int(OTP_PUSH_LCHAR, 0); }
+ | '\\' '(' '$' '-' NUMBER ')'
+ { out_int(OTP_PUSH_LCHAR, $5.yint); }
+ | '(' RestRightExpr ')'
+ ;
+
+RightState :
+ /* Empty */
+ | '<' '>'
+ { out_int(OTP_STATE_CHANGE, 0); }
+ | '<' ID '>'
+ { out_int(OTP_STATE_CHANGE, lookup_state($2.ystring)); }
+ | '<' PUSH ID '>'
+ { out_int(OTP_STATE_PUSH, lookup_state($3.ystring)); }
+ | '<' POP '>'
+ { out_int(OTP_STATE_POP, 0); }
+ ;
+%%