diff tests/agcl/parsifal/ss-kb.syn @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/agcl/parsifal/ss-kb.syn	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,510 @@
+/*
+Copyright 1992, Jerome T. Holland
+See the file COPYING for license and usage terms.
+*/
+
+/* Keyboard syntax for Sample Spreadsheet */
+
+backspace          = '\b'
+delete             = 339
+letter             = 'a-z' + 'A-Z'
+digit              = '0-9'
+eof                = 0
+any key            =~eof
+yes                ='y' + 'Y'
+no                 =~yes
+
+text character     = 32..127
+
+up                 = 328
+page up            = 329
+left               = 331
+right              = 333
+down               = 336
+page down          = 337
+control page up    = 388
+control page down  = 374
+control left       = 371
+control right      = 372
+home               = 327
+control home       = 375
+end                = 335
+control end        = 373
+escape             = 27
+return             = '\r'
+
+alt x              = 301
+
+F1                 = 315
+F2                 = 316
+
+file error message   = !display_message(&file_error_msg);
+goto query           = !accept_text(&goto_msg,"");
+load name query      = !accept_text(&load_from_msg, file_name);
+no such file message = !accept_text(&nonexistent_msg, file_name);
+overwrite query      = !display_message(&file_exists_msg);
+save changes query   = !display_message(&changes_msg);
+save name query      = !accept_text(&save_to_msg, file_name);
+print file query     = !accept_text(&print_to_msg, file_name);
+block query          = !accept_text(&block_msg,"");
+decimals query       = !accept_text(&decimals_msg, "");
+bad decimals message = !accept_text(&bad_decimals_msg,NULL);
+
+[
+//  sticky edit text
+ ~allow macros
+  default token type = void
+ ~lines and columns
+ ~diagnose errors
+  reduction choices
+  parser file name = "#.cpp"
+]
+
+
+grammar
+ -> {top level command =update_status();}..., eof
+
+top level command
+ -> recalc request                    =recalc();
+ -> utility menu, 'f' + 'F'           =toggle_formula_display();
+ -> main menu, 'a'+'A'                =autocalc_flag = !autocalc_flag;
+// -> edit request, edit text, return?  =set_cell_text();
+ -> edit request, edit text, return   =set_cell_text();
+ -> edit request, edit text, escape
+ -> delete request                    =delete_cell();
+ -> page up                           =page_up();
+ -> page down                         =page_down();
+ -> control left                      =scroll_left();
+ -> control right                     =scroll_right();
+ -> home                              =home();
+ -> end                               =end();
+ -> up                                =cursor_up();
+ -> down                              =cursor_down();
+ -> left                              =cursor_left();
+ -> right                             =cursor_right();
+ -> load file
+ -> save file
+ -> clear spreadsheet
+ -> format
+ -> exit                              =quit();
+ -> error
+ -> goto
+ -> column menu, 'i' + 'I'            =insert_column();
+ -> column menu, 'd' + 'D'            =delete_column();
+ -> column width
+ -> row menu, 'i' + 'I'               =insert_row();
+ -> row menu, 'd' + 'D'               =delete_row();
+ -> any menu, escape
+ -> print menu, 'o' + 'O', print file name    =print();
+
+any menu
+ -> main menu
+ -> spreadsheet menu
+ -> utility menu
+ -> column menu
+ -> row menu
+
+format
+ -> format menu, 'c' + 'C', block                 =set_conversion(currency);
+ -> format menu, 'g' + 'G', block                 =set_conversion(general);
+ -> format menu, 'f' + 'F', digits spec:n, block  =set_decimals(n);
+ -> label menu, how:h, block                      =set_alignment(h);
+
+(int) how
+ -> 'l' + 'L'  =LEFT;
+ -> 'c' + 'C'  =CENTER;
+ -> 'r' + 'R'  =RIGHT;
+
+(int) digits spec, bad digits spec
+ -> decimals query, edit number, return               =check_digits();
+ -> bad digits spec, bad decimals message, edit number, return =check_digits();
+
+recalc request
+ -> F1
+ -> utility menu, 'r' + 'R'
+
+delete request
+ -> delete
+ -> main menu, 'd' + 'D'
+
+goto
+ -> main menu, 'g' + 'G', goto query, cell name      =go();
+
+column width request
+ -> column menu, 'w' + 'W'          =accept_text(&col_width_msg,"");
+
+column width, column width request
+ -> column width request, edit number, return    =set_column_width();
+
+column width
+ -> column width request, edit number, escape
+
+cell name, bad cell name
+ -> edit text, return                  =parse_cell_name();
+ -> edit text, escape
+ -> bad cell name, edit text, return   =parse_cell_name();
+ -> bad cell name, edit text, escape
+
+block, bad block
+ -> block query, edit text, return     =parse_block();
+ -> block query, edit text, escape
+ -> bad block, edit text, return       =parse_block();
+ -> bad block, edit text, escape
+
+exit
+ -> exit request, save changes
+
+exit request
+ -> main menu, 'q' + 'Q'
+ -> alt x
+
+load file
+ -> spreadsheet menu, 'l' + 'L', save changes, load spreadsheet
+
+save file
+ -> spreadsheet menu, 's' + 'S', save spreadsheet
+
+save changes
+ -> not changed
+ -> changed, save changes query, no
+ -> changed, save changes query, yes, save spreadsheet
+
+changed, not changed
+ -> !STATUS(n_changes, changed);
+
+save spreadsheet
+ -> save name query, write file
+ -> save name query, old file, overwrite query, no, save spreadsheet
+
+load spreadsheet
+ -> load name query, old file      =load_file();
+ -> load name query, new file, no such file message, load spreadsheet
+
+print file name
+ -> print file query, new file
+ -> print file query, old file, overwrite query, yes
+ -> print file query, old file, overwrite query, no, print file name
+
+new file, old file
+ -> edit text, return                     =check_file_name();
+
+write file, file error
+ -> new file                       =write_file();
+ -> old file, overwrite query, yes =write_file();
+
+write file
+ -> file error, file error message, any key
+
+clear spreadsheet
+ -> clear spreadsheet request, yes      =clear();
+ -> clear spreadsheet request, no
+
+clear spreadsheet request
+ -> spreadsheet menu, 'c' + 'C'    =display_message(&clear_spreadsheet);
+
+main menu
+ -> '/'                            =display_menu(&main_menu);
+
+spreadsheet menu
+ -> main menu, 's' + 'S'           =display_menu(&spreadsheet_menu);
+
+column menu
+ -> main menu, 'c' + 'C'           =display_menu(&column_menu);
+
+row menu
+ -> main menu, 'r' + 'R'           =display_menu(&row_menu);
+
+utility menu
+ -> main menu, 'u' + 'U'           =display_menu(&utility_menu);
+
+format menu
+ -> main menu, 'f' + 'F'           =display_menu(&format_menu);
+
+label menu
+ -> format menu, 'l' + 'L'         =display_menu(&label_menu);
+
+print menu
+ -> spreadsheet menu, 'p' + 'P'    =pm_msg();
+ -> print menu, 'w' + 'W' + 'n' + 'N'  =print_wide = !print_wide, pm_msg();
+ -> print menu, 'l' + 'L'          =(print_border = !print_border),pm_msg();
+ -> print menu, 'b' + 'B',
+    block =print_block=TRUE,print_from=first_cell,print_to=last_cell,pm_msg();
+
+edit request
+ -> F2                             =init_cell_edit();
+ -> main menu, 'e' + 'E'           =init_cell_edit();
+ -> text character - '/':c         =init_text_input(c);
+ -> ^S                             =init_text_input('ä');    //228
+ -> ^P                             =init_text_input('ã');    //227
+
+(void) edit text
+ ->
+ -> edit text, text character:c =insert_char(c);
+ -> edit text, ^S       =insert_char(228);
+ -> edit text, ^P       =insert_char(227);
+ -> edit text, edit key
+
+(void) edit number
+ ->
+ -> edit number, digit:d =insert_char(d);
+ -> edit number, edit key
+
+(void) edit key
+ -> backspace           =backspace_char();
+ -> delete              =delete_char();
+ -> left                =text_cursor_left();
+ -> right               =text_cursor_right();
+ -> home                =text_cursor_home();
+ -> end                 =text_cursor_end();
+ -> error               =beep();
+
+{
+#include "ssd.h"
+
+char text_buffer[100];
+int text_index;
+pair<int> text_cursor = {INPUT_LINE, 1};
+
+#define GET_INPUT {int c;\
+  PCB.input_code = ((c=getch()) != 0 ? c : getch()+256);}
+
+#define SYNTAX_ERROR
+
+#define STATUS(x,y) PCB.reduction_token = (x)?kb_##y##_token:kb_not_##y##_token
+
+void beep(void) {
+  sound(440);
+  delay(75);
+  nosound();
+}
+
+void accept_text(message *m, char *t) {
+  display_message(m);
+  init_text_edit(t);
+}
+
+void backspace_char(void) {
+  if (text_cursor.col == 1) return;
+  text_cursor_left();
+  delete_char();
+}
+
+int check_digits(void){
+  char *tb = text_buffer + 1;
+  int n;
+  for (n = 0; *tb;) n = 10*n + *tb++ - '0';
+  if (n > 7) CHANGE_REDUCTION(bad_digits_spec);
+  return n;
+}
+
+void delete_cell(void) {
+  cell_pointer cp = ss[ac.ssc.row][ac.ssc.col];
+  if (cp) free(cp);
+  ss[ac.ssc.row][ac.ssc.col] = NULL;
+  update_cell(ac.scc, ac.ssc);
+  set_active_cell();
+}
+
+void delete_char(void) {
+  strcpy(&text_buffer[text_cursor.col], &text_buffer[text_cursor.col+1]);
+  display_field(
+    text_cursor,
+    SCREEN_WIDTH - text_cursor.col,
+    LEFT,
+    TEXT_COLOR,
+    "%s",
+    &text_buffer[text_cursor.col]
+  );
+  set_cursor(text_cursor);
+}
+
+void delete_column(void) {
+  int i,j;
+  new_column = ac.ssc.col;
+  for (i = 0; i < MAXROWS; i++) if (ss[i][new_column]) free(ss[i][new_column]);
+  for (i = new_column; i < max_col; i++)
+    for (j = 0; j <= max_row; j++)
+      ss[j][i] = ss[j][i+1];
+  for (j = 0; j <= max_row; j++) ss[j][max_col] = NULL;
+  max_col--;
+  inserted_columns = -1;
+  relabel(0,new_column);
+  new_column = inserted_columns = 0;
+}
+
+void delete_row(void) {
+  int i,j;
+  new_row = ac.ssc.row;
+  for (i = 0; i < MAXCOLS; i++) if (ss[new_row][i]) free(ss[new_row][i]);
+  for (i = new_row; i < max_row; i++)
+    for (j = 0; j <= max_col; j++)
+      ss[i][j] = ss[i+1][j];
+  for (j = 0; j <= max_col; j++) ss[max_row][j] = NULL;
+  max_row--;
+  inserted_rows = -1;
+  relabel(new_row,0);
+  new_row = inserted_rows = 0;
+}
+
+void init_cell_edit(void) {
+  cell_pointer cp = ss[ac.ssc.row][ac.ssc.col];
+  if (cp) strcpy(text_buffer+1, cp->text);
+  else text_buffer[1] = 0;
+  text_cursor.col = strlen(text_buffer+1) + 1;
+  textattr(TEXT_COLOR);
+  _setcursortype(_NORMALCURSOR);
+  input_msg.msg = text_buffer+1;
+  display_message(&input_msg);
+  set_cursor(text_cursor);
+}
+
+void init_text_edit(char *c) {
+  if (c) strcpy(text_buffer+1, c);
+  text_cursor.col = strlen(text_buffer+1) + 1;
+  textattr(TEXT_COLOR);
+  _setcursortype(_NORMALCURSOR);
+  input_msg.msg = text_buffer+1;
+  display_message(&input_msg);
+  set_cursor(text_cursor);
+}
+
+void init_text_input(int c) {
+  textattr(TEXT_COLOR);
+  _setcursortype(_NORMALCURSOR);
+  text_buffer[text_cursor.col = 1] = c;
+  set_cursor(text_cursor);
+  putch(c);
+  text_buffer[++text_cursor.col] = 0;
+}
+
+void insert_char(int c){
+  int n = strlen(&text_buffer[text_cursor.col]);
+  memmove(&text_buffer[text_cursor.col+1], &text_buffer[text_cursor.col], n+1);
+  text_buffer[81] = 0;
+  text_buffer[text_cursor.col++] = c;
+  putch(c);
+  display_field(text_cursor, n, LEFT, TEXT_COLOR, &text_buffer[text_cursor.col]);
+  set_cursor(text_cursor);
+}
+
+void insert_column(void) {
+  int i,j;
+  if (max_col + 1 >= MAXCOLS) {
+    for (i = 0; i < MAXROWS; i++) if (ss[i][max_col]) free(ss[i][max_col]);
+  }
+  max_col++;
+  new_column = ac.ssc.col;
+  for (i = max_col; i > new_column; i--)
+    for (j = 0; j <= max_row; j++)
+      ss[j][i] = ss[j][i-1];
+  for (j = 0; j < MAXROWS; j++) ss[j][new_column] = NULL;
+  inserted_columns = 1;
+  relabel(0,new_column);
+  new_column = inserted_columns = 0;
+}
+
+void insert_row(void) {
+  int i,j;
+  if (max_row + 1 >= MAXROWS) {
+    for (i = 0; i < MAXCOLS; i++) if (ss[max_row][i]) free(ss[max_row][i]);
+  }
+  max_row++;
+  new_row = ac.ssc.row;
+  for (i = max_row; i > new_row; i--)
+    for (j = 0; j <= max_col; j++)
+      ss[i][j] = ss[i-1][j];
+  for (j = 0; j < MAXCOLS; j++) ss[new_row][j] = NULL;
+  inserted_rows = 1;
+  relabel(new_row,0);
+  new_row = inserted_rows = 0;
+}
+
+void recalc(void) {
+  int i,j;
+  recalc_flag = 1;
+  circular_flag = 0;
+  for (i = 0; i <= max_row; i++) for (j = 0; j <= max_col; j++) {
+    cell_pointer cp = ss[i][j];
+
+    if (cp == NULL || cp->type != formula) continue;
+    if (cp->recalc == recalc_count) eval(cp);
+  }
+  recalc_count += 2;
+  recalc_flag = 0;
+  update_screen();
+  set_active_cell();
+}
+
+void relabel(int row, int col) {
+  int i,j;
+
+  n_changes++;
+  for (i = row; i <= max_row; i++) for (j = col; j <= max_col; j++) {
+    cell_pointer cp = ss[i][j];
+
+    if (cp == NULL || cp->type != formula) continue;
+    relabel_formula(cp);
+  }
+  update_screen();
+  set_active_cell();
+}
+
+void set_cell_text(void) {
+  char *tb = text_buffer + 1;
+  cell_pointer cp = realloc(
+    ss[ac.ssc.row][ac.ssc.col],
+    sizeof(cell_descriptor) + strlen(tb)
+  );
+  n_changes++;
+  assert(cp);
+  if (ac.ssc.row > max_row) max_row = ac.ssc.row;
+  if (ac.ssc.col > max_col) max_col = ac.ssc.col;
+  strcpy(cp->text, tb);
+  cp->error = 0;
+  ss[ac.ssc.row][ac.ssc.col] = cp;
+  cp->recalc = recalc_count;
+  _setcursortype(_NOCURSOR);
+  eval(cp);
+  if (cp->type != text && autocalc_flag) recalc();
+  else {
+    update_cell(ac.scc, ac.ssc);
+    set_active_cell();
+  }
+}
+
+void text_cursor_end(void) {
+  while (text_buffer[text_cursor.col]) {
+    text_cursor.col++;
+  }
+  set_cursor(text_cursor);
+}
+
+void text_cursor_home(void) {
+  if (text_cursor.col == 1) return;
+  text_cursor.col = 1;
+  set_cursor(text_cursor);
+}
+
+void text_cursor_left(void) {
+  if (text_cursor.col == 1) return;
+  text_cursor.col--;
+  set_cursor(text_cursor);
+}
+
+void text_cursor_right(void) {
+  if (text_buffer[text_cursor.col] == 0) return;
+  if (text_cursor.col >= SCREEN_WIDTH) return;
+  text_cursor.col++;
+  set_cursor(text_cursor);
+}
+
+void toggle_formula_display(void) {
+  formula_flag = !formula_flag;
+  display_message(&form_msg);
+  update_screen();
+  set_active_cell();
+}
+
+}
+
+