558 lines
24 KiB
Plaintext
558 lines
24 KiB
Plaintext
%{
|
|
#define MOOTERM_COMPILATION
|
|
#include "mooterm/mootermparser.h"
|
|
|
|
#define add_number(num) \
|
|
{ \
|
|
if (!parser->nums_len) \
|
|
{ \
|
|
parser->nums[0] = num; \
|
|
parser->nums_len = 1; \
|
|
} \
|
|
else \
|
|
{ \
|
|
if (parser->nums_len >= MAX_NUMS_LEN) \
|
|
{ \
|
|
g_warning ("%s: too big number of " \
|
|
"arguments, discarding", \
|
|
G_STRLOC); \
|
|
YYABORT; \
|
|
} \
|
|
parser->nums[parser->nums_len++] = num; \
|
|
} \
|
|
}
|
|
|
|
#define add_char(c) \
|
|
{ \
|
|
if (!parser->string_len) \
|
|
{ \
|
|
parser->string[0] = c; \
|
|
parser->string_len = 1; \
|
|
} \
|
|
else \
|
|
{ \
|
|
if (parser->string_len >= MAX_ESC_SEQ_LEN) \
|
|
{ \
|
|
g_warning ("%s: string too long, " \
|
|
"discarding", G_STRLOC); \
|
|
YYABORT; \
|
|
} \
|
|
parser->string[parser->string_len++] = c; \
|
|
} \
|
|
}
|
|
|
|
#define set_cmd(cmd_code) \
|
|
{ \
|
|
parser->cmd = cmd_code; \
|
|
YYACCEPT; \
|
|
}
|
|
|
|
#define check_nums_len(cmd, n) \
|
|
{ \
|
|
if (parser->nums_len != n) \
|
|
{ \
|
|
g_warning ("%s: invalid number of " \
|
|
"arguments for " #cmd \
|
|
" command", G_STRLOC); \
|
|
YYABORT; \
|
|
} \
|
|
}
|
|
|
|
#define check_one(cmd, num, num1) \
|
|
{ \
|
|
if (num != num1) \
|
|
{ \
|
|
g_warning ("%s: invalid argument %d" \
|
|
" for " #cmd " command", \
|
|
G_STRLOC, num); \
|
|
YYABORT; \
|
|
} \
|
|
}
|
|
|
|
#define check_range(cmd, num, num1, num2) \
|
|
{ \
|
|
if (num < num1 || num > num2) \
|
|
{ \
|
|
g_warning ("%s: invalid argument %d" \
|
|
" for " #cmd " command", \
|
|
G_STRLOC, num); \
|
|
YYABORT; \
|
|
} \
|
|
}
|
|
|
|
#define check_nums_2(cmd, num1, num2) \
|
|
{ \
|
|
if (parser->nums_len != 2 || \
|
|
parser->nums[0] != num1 || \
|
|
parser->nums[1] != num2) \
|
|
{ \
|
|
g_warning ("%s: invalid arguments" \
|
|
" for " #cmd " command", \
|
|
G_STRLOC); \
|
|
YYABORT; \
|
|
} \
|
|
}
|
|
|
|
#define push_one_back() \
|
|
{ \
|
|
g_assert (!iter_is_start (&parser->current)); \
|
|
iter_backward (&parser->current); \
|
|
iter_backward (&parser->cmd_string.end); \
|
|
}
|
|
|
|
%}
|
|
|
|
%name-prefix="_moo_term_yy"
|
|
|
|
%lex-param {MooTermParser *parser}
|
|
%parse-param {MooTermParser *parser}
|
|
|
|
%token DIGIT
|
|
|
|
%%
|
|
|
|
command: vt100
|
|
| vt102
|
|
| vt220
|
|
| Edward_Moy
|
|
| Skip_Montanaro
|
|
| terminfo
|
|
;
|
|
|
|
/* Xterm Control Sequences by Edward Moy */
|
|
Edward_Moy: G2_charset
|
|
| G3_charset
|
|
| DCS
|
|
| init_hilite_mouse_tracking
|
|
| restore_DECSET
|
|
| save_DECSET
|
|
| set_text
|
|
| PM
|
|
| APC
|
|
| memory_lock
|
|
| memory_unlock
|
|
| LS2
|
|
| LS3
|
|
| LS3R
|
|
| LS1R
|
|
;
|
|
|
|
/* From: Skip Montanaro
|
|
To: xpert@expo.lcs.mit.edu
|
|
Subject: XTerm Escape Sequences (X11 Version)
|
|
*/
|
|
Skip_Montanaro: BELL
|
|
| BACKSPACE
|
|
| TAB
|
|
| LINEFEED
|
|
| VERT_TAB
|
|
| FORM_FEED
|
|
| CARRIAGE_RETURN
|
|
| ALT_CHARSET
|
|
| NORM_CHARSET
|
|
| track_mouse
|
|
;
|
|
|
|
terminfo: cbt
|
|
| ech
|
|
| hpa
|
|
| rs2
|
|
| u6
|
|
| u8
|
|
| vpa
|
|
;
|
|
|
|
vt100: CUB
|
|
| CUD
|
|
| CUF
|
|
| CUP
|
|
| CUU
|
|
| DA
|
|
| DECALN_or_line_size
|
|
| DECID
|
|
| DECKPAM
|
|
| DECKPNM
|
|
| DECLL
|
|
| DECSC_DECRC
|
|
| DECREQTPARM
|
|
| DECSTBM
|
|
| DECTST
|
|
| DSR
|
|
| ED
|
|
| EL
|
|
| HTS
|
|
| HVP
|
|
| IND
|
|
| NEL
|
|
| RI
|
|
| RIS
|
|
| RM
|
|
| SCS
|
|
| SGR
|
|
| SM
|
|
| TBC
|
|
;
|
|
|
|
vt102: MC /* Media Copy - printer stuff - ignored */
|
|
| SS2
|
|
| SS3
|
|
;
|
|
|
|
vt220: ICH
|
|
| DCH
|
|
| IL
|
|
| DL
|
|
;
|
|
|
|
/****************************************************************************/
|
|
/* vt100
|
|
*/
|
|
|
|
DECALN_or_line_size: '#' number { push_one_back ();
|
|
add_number ($2);
|
|
switch ($2)
|
|
{
|
|
case 3:
|
|
case 4:
|
|
set_cmd (CMD_DECDHL);
|
|
case 6:
|
|
set_cmd (CMD_DECDWL);
|
|
case 5:
|
|
set_cmd (CMD_DECSWL);
|
|
case 8:
|
|
set_cmd (CMD_DECALN);
|
|
default:
|
|
g_warning ("%s: invalid argument %d",
|
|
G_STRLOC, $2);
|
|
YYABORT;
|
|
}
|
|
}
|
|
;
|
|
DECLL: '[' number 'q' { add_number ($2); set_cmd (CMD_DECLL); }
|
|
;
|
|
SCS: G0_charset
|
|
| G1_charset
|
|
;
|
|
DECTST: '[' numbers 'y' { check_nums_len (DECTST, 2); set_cmd (CMD_DECTST); }
|
|
;
|
|
|
|
SM: '[' numbers 'h' { set_cmd (CMD_SM); }
|
|
| '[' '?' numbers 'h' { set_cmd (CMD_DECSET); }
|
|
;
|
|
RM: '[' numbers 'l' { set_cmd (CMD_RM); }
|
|
| '[' '?' numbers 'l' { set_cmd (CMD_DECRST); }
|
|
;
|
|
G0_charset: '(' number { push_one_back ();
|
|
check_range (G0_charset, $2, 0, 2);
|
|
add_number (0);
|
|
set_cmd (CMD_G0_CHARSET); }
|
|
| '(' 'A' { add_number (3);
|
|
set_cmd (CMD_G0_CHARSET); }
|
|
| '(' 'B' { add_number (4);
|
|
set_cmd (CMD_G0_CHARSET); }
|
|
;
|
|
G1_charset: ')' number { push_one_back ();
|
|
check_range (G1_charset, $2, 0, 2);
|
|
add_number (0);
|
|
set_cmd (CMD_G1_CHARSET); }
|
|
| ')' 'A' { add_number (3);
|
|
set_cmd (CMD_G1_CHARSET); }
|
|
| ')' 'B' { add_number (4);
|
|
set_cmd (CMD_G1_CHARSET); }
|
|
;
|
|
DECSC_DECRC: number { push_one_back ();
|
|
check_range (DECSC_DECRC, $1, 7, 8);
|
|
if ($1 == 7)
|
|
{
|
|
set_cmd (CMD_DECSC);
|
|
}
|
|
else
|
|
{
|
|
set_cmd (CMD_DECRC);
|
|
}
|
|
}
|
|
;
|
|
DECKPAM: '=' { set_cmd (CMD_DECKPAM); }
|
|
;
|
|
DECKPNM: '>' { set_cmd (CMD_DECKPNM); }
|
|
;
|
|
IND: 'D' { set_cmd (CMD_IND); }
|
|
;
|
|
NEL: 'E' { set_cmd (CMD_NEL); }
|
|
;
|
|
HTS: 'H' { set_cmd (CMD_HTS); }
|
|
;
|
|
RI: 'M' { set_cmd (CMD_RI); }
|
|
;
|
|
DECID: 'Z' { set_cmd (CMD_DA); }
|
|
;
|
|
CUU: '[' number 'A' { add_number ($2); set_cmd (CMD_CUU); }
|
|
| '[' 'A' { add_number (1); set_cmd (CMD_CUU); }
|
|
;
|
|
CUD: '[' number 'B' { add_number ($2); set_cmd (CMD_CUD); }
|
|
| '[' 'B' { add_number (1); set_cmd (CMD_CUD); }
|
|
;
|
|
CUF: '[' number 'C' { add_number ($2); set_cmd (CMD_CUF); }
|
|
| '[' 'C' { add_number (1); set_cmd (CMD_CUF); }
|
|
;
|
|
CUB: '[' number 'D' { add_number ($2); set_cmd (CMD_CUB); }
|
|
| '[' 'D' { add_number (1); set_cmd (CMD_CUB); }
|
|
;
|
|
CUP: '[' numbers 'H' { check_nums_len (CUP, 2); set_cmd (CMD_CUP); }
|
|
| '[' 'H' { add_number (1); add_number (1); set_cmd (CMD_CUP); }
|
|
;
|
|
ED: '[' number 'J' { add_number ($2); set_cmd (CMD_ED); }
|
|
| '[' 'J' { add_number (0); set_cmd (CMD_ED); }
|
|
;
|
|
EL: '[' number 'K' { add_number ($2); set_cmd (CMD_EL); }
|
|
| '[' 'K' { add_number (0); set_cmd (CMD_EL); }
|
|
;
|
|
DA: '[' number 'c' { check_one (DA, $2, 0); set_cmd (CMD_DA); }
|
|
| '[' 'c' { set_cmd (CMD_DA); }
|
|
;
|
|
HVP: '[' numbers 'f' { check_nums_len (HVP, 2); set_cmd (CMD_HVP); }
|
|
| '[' 'f' { add_number (1); add_number (1); set_cmd (CMD_HVP); }
|
|
;
|
|
TBC: '[' number 'g' { add_number ($2); set_cmd (CMD_TBC); }
|
|
| '[' 'g' { add_number (0); set_cmd (CMD_TBC); }
|
|
;
|
|
SGR: '[' numbers 'm' { set_cmd (CMD_SGR); }
|
|
| '[' 'm' { add_number (0); set_cmd (CMD_SGR); }
|
|
;
|
|
DSR: '[' numbers 'n' { set_cmd (CMD_DSR); }
|
|
;
|
|
DECSTBM: '[' numbers 'r' { check_nums_len (DECSTBM, 2); set_cmd (CMD_DECSTBM); }
|
|
| '[' 'r' { add_number (0); add_number (1000000); set_cmd (CMD_DECSTBM); }
|
|
;
|
|
DECREQTPARM: '[' number 'x' { add_number ($2); set_cmd (CMD_DECREQTPARM); }
|
|
;
|
|
RIS: 'c' { set_cmd (CMD_RIS); }
|
|
;
|
|
|
|
/****************************************************************************/
|
|
/* vt102
|
|
*/
|
|
|
|
MC: '[' '?' number 'i' { set_cmd (CMD_MC); }
|
|
| '[' number 'i' { set_cmd (CMD_MC); }
|
|
| '[' 'i' { set_cmd (CMD_MC); }
|
|
;
|
|
SS2: 'N' { set_cmd (CMD_SS2); }
|
|
;
|
|
SS3: 'O' { set_cmd (CMD_SS3); }
|
|
;
|
|
|
|
/****************************************************************************/
|
|
/* vt220
|
|
*/
|
|
|
|
ICH: '[' number '@' { add_number ($2); set_cmd (CMD_ICH); }
|
|
| '[' '@' { add_number (1); set_cmd (CMD_ICH); }
|
|
;
|
|
DCH: '[' number 'P' { add_number ($2); set_cmd (CMD_DCH); }
|
|
| '[' 'P' { add_number (1); set_cmd (CMD_DCH); }
|
|
;
|
|
IL: '[' number 'L' { add_number ($2); set_cmd (CMD_IL); }
|
|
| '[' 'L' { add_number (1); set_cmd (CMD_IL); }
|
|
;
|
|
DL: '[' number 'M' { add_number ($2); set_cmd (CMD_DL); }
|
|
| '[' 'M' { add_number (1); set_cmd (CMD_DL); }
|
|
;
|
|
|
|
/****************************************************************************/
|
|
/* numbers
|
|
*/
|
|
|
|
number: DIGIT { $$ = $1; }
|
|
| number DIGIT { $$ = $1 * 10 + $2; }
|
|
;
|
|
|
|
numbers: number { add_number ($1); }
|
|
| numbers ';' number { add_number ($3); }
|
|
;
|
|
|
|
|
|
/****************************************************************************/
|
|
/* Skip_Montanaro
|
|
*/
|
|
|
|
BELL: '\007' { set_cmd (CMD_BELL); }
|
|
| '#' '\007' { set_cmd (CMD_BELL); }
|
|
| '(' '\007' { set_cmd (CMD_BELL); }
|
|
| '[' '\007' { set_cmd (CMD_BELL); }
|
|
| '[' '?' '\007' { set_cmd (CMD_BELL); }
|
|
;
|
|
BACKSPACE: '\010' { set_cmd (CMD_BACKSPACE); }
|
|
| '#' '\010' { set_cmd (CMD_BACKSPACE); }
|
|
| '(' '\010' { set_cmd (CMD_BACKSPACE); }
|
|
| '[' '\010' { set_cmd (CMD_BACKSPACE); }
|
|
| '[' '?' '\010' { set_cmd (CMD_BACKSPACE); }
|
|
;
|
|
TAB: '\011' { set_cmd (CMD_TAB); }
|
|
| '#' '\011' { set_cmd (CMD_TAB); }
|
|
| '(' '\011' { set_cmd (CMD_TAB); }
|
|
| '[' '\011' { set_cmd (CMD_TAB); }
|
|
| '[' '?' '\011' { set_cmd (CMD_TAB); }
|
|
;
|
|
LINEFEED: '\012' { set_cmd (CMD_LINEFEED); }
|
|
| '#' '\012' { set_cmd (CMD_LINEFEED); }
|
|
| '(' '\012' { set_cmd (CMD_LINEFEED); }
|
|
| '[' '\012' { set_cmd (CMD_LINEFEED); }
|
|
| '[' '?' '\012' { set_cmd (CMD_LINEFEED); }
|
|
;
|
|
VERT_TAB: '\013' { set_cmd (CMD_VERT_TAB); }
|
|
| '#' '\013' { set_cmd (CMD_VERT_TAB); }
|
|
| '(' '\013' { set_cmd (CMD_VERT_TAB); }
|
|
| '[' '\013' { set_cmd (CMD_VERT_TAB); }
|
|
| '[' '?' '\013' { set_cmd (CMD_VERT_TAB); }
|
|
;
|
|
FORM_FEED: '\014' { set_cmd (CMD_FORM_FEED); }
|
|
| '#' '\014' { set_cmd (CMD_FORM_FEED); }
|
|
| '(' '\014' { set_cmd (CMD_FORM_FEED); }
|
|
| '[' '\014' { set_cmd (CMD_FORM_FEED); }
|
|
| '[' '?' '\014' { set_cmd (CMD_FORM_FEED); }
|
|
;
|
|
CARRIAGE_RETURN:'\015' { set_cmd (CMD_CARRIAGE_RETURN); }
|
|
| '#' '\015' { set_cmd (CMD_CARRIAGE_RETURN); }
|
|
| '(' '\015' { set_cmd (CMD_CARRIAGE_RETURN); }
|
|
| '[' '\015' { set_cmd (CMD_CARRIAGE_RETURN); }
|
|
| '[' '?' '\015' { set_cmd (CMD_CARRIAGE_RETURN); }
|
|
;
|
|
ALT_CHARSET: '\016' { set_cmd (CMD_ALT_CHARSET); }
|
|
| '#' '\016' { set_cmd (CMD_ALT_CHARSET); }
|
|
| '(' '\016' { set_cmd (CMD_ALT_CHARSET); }
|
|
| '[' '\016' { set_cmd (CMD_ALT_CHARSET); }
|
|
| '[' '?' '\016' { set_cmd (CMD_ALT_CHARSET); }
|
|
;
|
|
NORM_CHARSET: '\017' { set_cmd (CMD_NORM_CHARSET); }
|
|
| '#' '\017' { set_cmd (CMD_NORM_CHARSET); }
|
|
| '(' '\017' { set_cmd (CMD_NORM_CHARSET); }
|
|
| '[' '\017' { set_cmd (CMD_NORM_CHARSET); }
|
|
| '[' '?' '\017' { set_cmd (CMD_NORM_CHARSET); }
|
|
;
|
|
track_mouse: '[' 'T' { set_cmd (CMD_TRACK_MOUSE); }
|
|
;
|
|
|
|
|
|
/****************************************************************************/
|
|
/* Edward_Moy
|
|
*/
|
|
|
|
G2_charset: '*' DIGIT { check_range (G2_charset, $2, 0, 2);
|
|
add_number (0);
|
|
set_cmd (CMD_G2_CHARSET); }
|
|
| '*' 'A' { add_number (3);
|
|
set_cmd (CMD_G2_CHARSET); }
|
|
| '*' 'B' { add_number (4);
|
|
set_cmd (CMD_G2_CHARSET); }
|
|
;
|
|
G3_charset: '+' DIGIT { check_range (G3_charset, $2, 0, 2);
|
|
add_number (0);
|
|
set_cmd (CMD_G3_CHARSET); }
|
|
| '+' 'A' { add_number (3);
|
|
set_cmd (CMD_G3_CHARSET); }
|
|
| '+' 'B' { add_number (4);
|
|
set_cmd (CMD_G3_CHARSET); }
|
|
;
|
|
DCS: 'P' no_escape_string '\033' '\\'
|
|
{ set_cmd (CMD_DCS); }
|
|
| 'P' '\033' '\\' { set_cmd (CMD_DCS); }
|
|
;
|
|
init_hilite_mouse_tracking: '[' numbers 'T' { check_nums_len (init_hilite_mouse_tracking, 5);
|
|
set_cmd (CMD_INIT_HILITE_MOUSE_TRACKING); }
|
|
;
|
|
restore_DECSET: '[' '?' numbers 'r' { set_cmd (CMD_RESTORE_DECSET); }
|
|
;
|
|
save_DECSET: '[' '?' numbers 's' { set_cmd (CMD_SAVE_DECSET); }
|
|
;
|
|
set_text: ']' number ';' printable_string non_printable_char
|
|
{ add_number ($2); set_cmd (CMD_SET_TEXT); }
|
|
| ']' number ';' non_printable_char
|
|
{ add_number ($2); set_cmd (CMD_SET_TEXT); }
|
|
;
|
|
PM: '^' no_escape_string '\033' '\\'
|
|
{ set_cmd (CMD_PM); }
|
|
| '^' '\033' '\\' { set_cmd (CMD_PM); }
|
|
;
|
|
APC: '_' no_escape_string '\033' '\\'
|
|
{ set_cmd (CMD_APC); }
|
|
| '_' '\033' '\\' { set_cmd (CMD_APC); }
|
|
;
|
|
memory_lock: 'l' { set_cmd (CMD_MEMORY_LOCK); }
|
|
;
|
|
memory_unlock: 'm' { set_cmd (CMD_MEMORY_UNLOCK); }
|
|
;
|
|
LS2: 'n' { set_cmd (CMD_LS2); }
|
|
;
|
|
LS3: 'o' { set_cmd (CMD_LS3); }
|
|
;
|
|
LS3R: '|' { set_cmd (CMD_LS3R); }
|
|
;
|
|
LS1R: '~' { set_cmd (CMD_LS1R); }
|
|
;
|
|
|
|
/****************************************************************************/
|
|
/* terminfo escape sequences
|
|
*/
|
|
|
|
cbt: '[' 'Z' { set_cmd (CMD_BACK_TAB); }
|
|
;
|
|
hpa: '[' number 'G' { add_number ($2);
|
|
set_cmd (CMD_COLUMN_ADDRESS); }
|
|
;
|
|
vpa: '[' number 'd' { add_number ($2);
|
|
set_cmd (CMD_ROW_ADDRESS); }
|
|
;
|
|
ech: '[' number 'X' { add_number ($2);
|
|
set_cmd (CMD_BACK_TAB); }
|
|
;
|
|
rs2: '[' '!' 'p' '\033' '[' '?' DIGIT ';' DIGIT 'l' '\033' '[' DIGIT 'l' '\033' '>'
|
|
{ check_one (rs2, $7, 3);
|
|
check_one (rs2, $9, 4);
|
|
check_one (rs2, $13, 4);
|
|
set_cmd (CMD_RESET_2STRING); }
|
|
;
|
|
u6: '[' numbers 'R' { set_cmd (CMD_USER6); }
|
|
;
|
|
u8: '[' '?' numbers 'c' { check_nums_2 (u8, 1, 2);
|
|
set_cmd (CMD_USER8); }
|
|
;
|
|
|
|
|
|
/****************************************************************************/
|
|
/* strings and characters
|
|
*/
|
|
|
|
printable_char: ' ' | '!' | '"' | '#' | '$' | '%' | '&' | '\'' | '(' | ')' | '*' | '+'
|
|
| ',' | '-' | '.' | '/' | ':'| ';' | '<' | '=' | '>' | '?' | '@'
|
|
| 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' |'H' | 'I' | 'J' | 'K' | 'L'
|
|
| 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X'
|
|
| 'Y' | 'Z' | '[' | '\\' | ']' | '^' | '_' | '`' | 'a' | 'b'| 'c' | 'd'
|
|
| 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' |'p'
|
|
| 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | '{' | '|'
|
|
| '}' | '~'
|
|
| DIGIT { $$ = $1 + 48; }
|
|
;
|
|
|
|
non_printable_non_escape_char: '\001' | '\002' | '\003' | '\004' | '\005' | '\006' | '\007'
|
|
| '\010' | '\011' | '\012' | '\013' | '\014' | '\015' | '\016' | '\017'
|
|
| '\020' | '\021' | '\022' | '\023' | '\024' | '\025' | '\026' | '\027'
|
|
| '\030' | '\031' | '\032' | '\034' | '\035' | '\036' | '\037' | '\177'
|
|
;
|
|
|
|
non_printable_char: non_printable_non_escape_char
|
|
| '\033'
|
|
;
|
|
|
|
non_escape_char: printable_char
|
|
| non_printable_non_escape_char
|
|
;
|
|
|
|
no_escape_string: non_escape_char { add_char ($1); }
|
|
| no_escape_string non_escape_char { add_char ($2); }
|
|
;
|
|
|
|
printable_string: printable_char { add_char ($1); }
|
|
| printable_string printable_char { add_char ($2); }
|
|
;
|