MAIN START
LAD GR1,BUF
LAD GR2,BUF2
CALL GETTKN
RET
BUF DC ' THIS 1234 99#AB* .'
BUF2 DS 30
GETTKN START
RPUSH
LD GR3,=-1 ; 単語種別の初期化
LAD GR1,-1,GR1 ; 先頭文字のアドレス - 1
LP LAD GR1,1,GR1 ; 次の文字のアドレスをGR1に設定
LD GR4,0,GR1 ; 文字を取り出す
CPL GR4,='.' ; 最終記号?
JZE FIN ; 最終記号の場合 FIN へ
CPL GR4,=' ' ; 空白間隔?
JNZ ALNUM ; 空白でない場合 ALNUM へ
CALL SETTKN ; 単語管理テーブル設定処理へ
JUMP LP ; 次の文字処理へ
ALNUM LD GR3,GR3 ; 単語の処理中?
JPL LP ; 処理中の単語が英字を含む場合は LP ヘ
JZE ACHK ; 処理中の単語が数字だけから成る場合は ACHK ヘ
LD GR3,=0 ; 次の単語の処理開始、単語種別を“数字だけから成る”に設定
LD GR6,GR1 ; 先頭アドレスを退避
ACHK CPL GR4,='9' ; 数字最大値
JPL NEXT ; 数字最大値より大きい、即ち英字を含む場合は NEXT へ
CPL GR4,='0' ; 数字最小値
JMI NEXT ; 数字最小値より小さい、即ち英字を含む場合は NEXT へ
JUMP LP ; 取り出した文字が数字の場合は LP ヘ
NEXT LD GR3,=1 ; 単語種別を“英字を含む”に設定
JUMP LP ; 取り出した文字が英字の場合は LP ヘ
FIN CALL SETTKN ; 単語管理テーブル設定処理へ
LD GR5,=-1 ; 終端マーク
ST GR5,0,GR2 ; 終端マークを単語管理テーブルに格納
RPOP
RET
SETTKN LD GR3,GR3 ; 単語の処理中?
JMI FIN2 ; GR3 = -1: 単語処理中でなければ何もしない
ST GR6,0,GR2 ; 退避した単語の先頭アドレスをGR2に格納
LD GR5,GR1 ; GR1のアドレスをGR5に格納
SUBL GR5,GR6 ; 単語最終文字のアドレス - 先頭アドレス
ST GR5,1,GR2 ; 単語の長さを格納
ST GR3,2,GR2 ; 単語の種別を格納
LD GR3,=-1 ; 単語種別を初期化(処理中状態を解除)
LAD GR2,3,GR2 ; 次の単語のアドレスを取得
FIN2 RET
END
出力結果
GR1,文字,ASCII
1007,△,20,
1008,△,20,
1009,T,54
100A,H,48
100B,I,49
100C,S,53
100D,△,20
100E,1,31
100F,2,32
1010,3,33
1011,4,34
1012,△,20
1013,△,20
1014,9,39
1015,9,39
1016,#,23
1017,A,41
1018,B,42
1019,*,2A
101A,△,20
101B,.,2E
GR2
アドレス,(単語先頭アドレス,長さ,種類)
101C,1009
101D,4
101E,1
101F,100E
1020,4
1021,0
1022,1014
1023,6
1024,1
1025,FFFF