ROMAN 7-SEP-1988 10:33:35 VAX SCAN V1.1-008 Page 1 7-SEP-1988 10:33:32 ISD$:[SCN.PARSER]ROMAN.SCN;5 (1) 1 MODULE roman; 2 3 ! 4 ! This module defines the subroutine that 5 ! checks and evaluate a roman numeral. 6 ! 7 ! The integer result is: 8 ! if positive, the resultant numerical value 9 ! if negative, the absolute value is the column 10 ! at which the parsing error was detected 11 ! 12 13 INCLUDE FILE 'sysdeflib$:recovery_packet.scndef'; 35 INCLUDE FILE 'roman.def'; 55 56 PROCEDURE report_roman_error ( error_packet: recovery_packet ); 57 roman_value = - ( error_packet.error_token_column - 1 ); 58 END PROCEDURE; /* report_roman_error 59 60 TOKEN rn_m { 'm' }; 61 TOKEN rn_d { 'd' }; 62 TOKEN rn_c { 'c' }; 63 TOKEN rn_l { 'l' }; 64 TOKEN rn_x { 'x' }; 65 TOKEN rn_v { 'v' }; 66 TOKEN rn_i { 'i' }; 67 TOKEN rc_cm { 'cm' }; 68 TOKEN rc_cd { 'cd' }; 69 TOKEN rc_xc { 'xc' }; 70 TOKEN rc_xl { 'xl' }; 71 TOKEN rc_ix { 'ix' }; 72 TOKEN rc_iv { 'iv' }; 73 TOKEN sos { S'SOS' }; 74 TOKEN eos { S'EOS' }; 75 TOKEN eol { S'EOL' }; 76 77 MACRO m SYNTAX { rn_m }; 78 roman_value = roman_value + 1000; 79 END MACRO; /* m 80 MACRO d SYNTAX { rn_d }; 81 roman_value = roman_value + 500; 82 END MACRO; /* d 83 MACRO c SYNTAX { rn_c }; 84 roman_value = roman_value + 100; 85 END MACRO; /* c 86 MACRO l SYNTAX { rn_l }; 87 roman_value = roman_value + 50; 88 END MACRO; /* l 89 MACRO x SYNTAX { rn_x }; ROMAN 7-SEP-1988 10:33:35 VAX SCAN V1.1-008 Page 2 7-SEP-1988 10:33:32 ISD$:[SCN.PARSER]ROMAN.SCN;5 (1) 90 roman_value = roman_value + 10; 91 END MACRO; /* x 92 MACRO v SYNTAX { rn_v }; 93 roman_value = roman_value + 5; 94 END MACRO; /* v 95 MACRO i SYNTAX { rn_i }; 96 roman_value = roman_value + 1; 97 END MACRO; /* i 98 MACRO cm SYNTAX { rc_cm }; 99 roman_value = roman_value + 900; 100 END MACRO; /* cm 101 MACRO cd SYNTAX { rc_cd }; 102 roman_value = roman_value + 400; 103 END MACRO; /* cd 104 MACRO xc SYNTAX { rc_xc }; 105 roman_value = roman_value + 90; 106 END MACRO; /* xc 107 MACRO xl SYNTAX { rc_xl }; 108 roman_value = roman_value + 40; 109 END MACRO; /* xl 110 MACRO ix SYNTAX { rc_ix }; 111 roman_value = roman_value + 9; 112 END MACRO; /* ix 113 MACRO iv SYNTAX { rc_iv }; 114 roman_value = roman_value + 4; 115 END MACRO; /* iv 116 117 MACRO c_s SYNTAX { c [ c [ c [ c ] ] ] }; 118 END MACRO; /* c_s 119 120 MACRO x_s SYNTAX { x [ x [ x [ x ] ] ] }; 121 END MACRO; /* x_s 122 123 MACRO i_s SYNTAX { i [ i [ i [ i ] ] ] }; 124 END MACRO; /* i_s 125 126 MACRO under_10 SYNTAX { v [ i_s ] | i_s | iv | ix }; 127 END MACRO; /* under_10 128 129 MACRO under_100 SYNTAX { l [ x_s ] | x_s | xl | xc }; 130 END MACRO; /* under_100 131 132 MACRO under_1000 SYNTAX { d [ c_s ] | c_s | cm | cd }; 133 END MACRO; /* under_1000 134 135 MACRO roman_numeral TRIGGER { sos ERROR( report_roman_error ) : 136 { [ m | m m ] [ under_1000 ] [ under_100 ] [ under_10 ] eol } eos }; 137 ANSWER S'EOS'; 138 END MACRO; /* roman_numeral 139 140 PROCEDURE roman_evaluate ( rnp: STRING ) OF INTEGER; ROMAN 7-SEP-1988 10:33:35 VAX SCAN V1.1-008 Page 3 7-SEP-1988 10:33:32 ISD$:[SCN.PARSER]ROMAN.SCN;5 (1) 141 DECLARE rnp_lower: STRING; 142 143 roman_value = 0; 144 rnp_lower = LOWER(rnp) & S'EOL'; 145 START SCAN INPUT STRING rnp_lower OUTPUT FILE 'nl:'; 146 147 RETURN roman_value; 148 END PROCEDURE; /* roman_evaluate 149 150 END MODULE; /* roman COMMAND LINE ------- ---- SCAN/LIS ISD$:[SCN.PARSER]ROMAN.SCN;5/DIAGNOSTICS=ISD$:[SCN.PARSER]ROMAN.DIA;