MAIN START
- LAD GR1,=''
+ LAD GR1,='
END RET
END
--- /dev/null
+MAIN START
+ LAD GR1,='ab'
+END RET
+ END
--- /dev/null
+MAIN START
+ LAD GR1,=''''
+ LAD GR2,='''a'
+END RET
+ END
--- /dev/null
+MAIN START
+END RET
+ DC 'a'b'
+ END
--- /dev/null
+MAIN START
+ LAD GR1,='''
+END RET
+ END
--- /dev/null
+MAIN START
+ LAD GR1,='''
+END RET
+ END
{ 122, "cannot create hash table" },
{ 124, "more than one character in literal" },
{ 125, "not GR in operand x" },
- { 126, "syntax error in literal" },
+ { 126, "syntax error in character constant. In CASL II, two consecutive apostrophes ('') represent a single apostrophe (')." },
+ { 127, "empty character constant" },
};
/**
assert(str[0] == '\'');
size_t len = strlen(str);
WORD val = 0;
- if (len < 2 || str[len - 1] != '\'' || (str[1] == '\'' && len == 3)) {
+ if(str[1] == '\'' && len == 2) {
+ setcerr(127, str); /* empty character constant */
+ } else if (len == 1 || str[len - 1] != '\'') {
setcerr(123, str); /* unclosed quote */
} else if((str[1] != '\'' && len > 3) || (str[1] == '\'' && len > 4)) {
setcerr(124, str); /* more than one character in literal */
- } else if(len ==2 && !strcmp(str, "''")) {
- setcerr(126, str); /* syntax error in literal */
+ } else if(str[1] == '\'' && len == 3 && str[2] == '\'') {
+ setcerr(126, str); /* syntax error in character constant. In CASL II, two consecutive apostrophes ('') represent a single apostrophe ('). */
} else {
val = (WORD)str[1];
}
{
assert(str[0] == '\'');
- /* 「'」1文字スキップし、次の文字が「'」でなければ正常終了 */
- for(int i = 1; str[i] != '\'' || str[++i] == '\''; i++) {
- /* 「'」が閉じないまま文字列が終了した場合はエラー */
- if(!str[i]) {
- setcerr(123, str); /* unclosed quote */
- break;
- }
- writememory(str[i], (asptr->ptr)++, pass);
+ /* 空文字列(DC '')はエラー */
+ if(str[1] == '\'' && str[2] == '\0') {
+ setcerr(127, str); /* empty character constant */
+ } else {
+ int i = 1;
+ do {
+ if(str[i] == '\0') {
+ /* 閉じクォートがないまま文字列が終了の場合 */
+ setcerr(123, str); /* unclosed quote */
+ break;
+ }
+ if(str[i] == '\'') {
+ if(str[i + 1] != '\0' && str[i + 1] != '\'') {
+ setcerr(126, str); /* syntax error in character constant. In CASL II, two consecutive apostrophes ('') represent a single apostrophe ('). */
+ break;
+ } else if(str[i + 1] == '\0') {
+ break; /* 正常終了 */
+ } else {
+ /* エスケープされたアポストロフィ:1文字として書き込み、2文字分進める */
+ writememory('\'', (asptr->ptr)++, pass);
+ i += 2;
+ }
+ } else {
+ writememory(str[i++], (asptr->ptr)++, pass);
+ }
+ } while(1);
}
}
* @brief casl2のエラー定義
*/
CERR cerr_casl2[] = {
- { 127, "no source file" },
+ { 128, "no source file" },
};
void addcerrlist_casl2()
/* ソースファイルが指定されていない場合は終了 */
if(argv[optind] == NULL) {
- setcerr(127, ""); /* no source file */
+ setcerr(128, ""); /* no source file */
fprintf(stderr, "casl2 error - %d: %s\n", cerr->num, cerr->msg);
goto casl2fin;
}
#include "assemble.h"
/**
- * ラベルのハッシュ値をセットしたキーを返す
+ * @brief ラベルのハッシュ値をセットしたキーを返す
*
* @return ハッシュ値をセットしたキー
*
HKEY *label_hashkey(const char *value);
/**
- * プログラム名とラベルに対応するハッシュ値を返す
+ * @brief プログラム名とラベルに対応するハッシュ値を返す
*
* @return ハッシュ値
*
unsigned labelhash(const char *prog, const char *label);
/**
- * ラベルを比較した結果を返す。qsort内で使われる関数
+ * @brief ラベルを比較した結果を返す。qsort内で使われる関数
*
* @return ラベルが同一の場合は0、異なる場合は0以外
*
int compare_adr(const void *a, const void *b);
/**
- * 定義されているラベルまたはリテラルの一覧を表示する
- *
- * @return ラベルが同一の場合は0、異なる場合は0以外
+ * @brief 定義されているラベルまたはリテラルの一覧を表示する
*
* @param literal リテラルの場合はtrue、それ以外はfalse
*/
+++ /dev/null
-
-Assemble ../../../../as/cmd/DC/dc__c2.casl (0)
-
-Assemble ../../../../as/cmd/DC/dc__c2.casl (1)
-../../../../as/cmd/DC/dc__c2.casl: 1:;; DC 文字定数
-../../../../as/cmd/DC/dc__c2.casl: 2:MAIN START
-../../../../as/cmd/DC/dc__c2.casl: 3: RET
- #0000 #8100
-../../../../as/cmd/DC/dc__c2.casl: 4: DC ''
-../../../../as/cmd/DC/dc__c2.casl: 5: END
-#0000: Register::::
-#0000: GR0: 0 = #0000 = 0000000000000000
-#0000: GR1: 0 = #0000 = 0000000000000000
-#0000: GR2: 0 = #0000 = 0000000000000000
-#0000: GR3: 0 = #0000 = 0000000000000000
-#0000: GR4: 0 = #0000 = 0000000000000000
-#0000: GR5: 0 = #0000 = 0000000000000000
-#0000: GR6: 0 = #0000 = 0000000000000000
-#0000: GR7: 0 = #0000 = 0000000000000000
-#0000: SP: 128 = #0080 = 0000000010000000
-#0000: PR: 0 = #0000 = 0000000000000000
-#0000: FR (OF SF ZF): 000
-#0000: Memory::::
-#0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
- -------------------------------------------------------------------------------------
-#0000: 0000: 8100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
-#0000: 0010: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
-#0000: 0020: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
-#0000: 0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
-#0000: 0040: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
-#0000: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
-#0000: 0060: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
-#0000: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
-
+++ /dev/null
-../../../../casl2 -atd -M128 ../../../../as/cmd/DC/dc__c2.casl
+++ /dev/null
-Assemble error - 123: GR1,='a: unclosed quote
-../../../../as/err/err_123_literal.casl: 2: LAD GR1,='a
+++ /dev/null
-../../../../casl2 ../../../../as/err/err_123_literal.casl
--- /dev/null
+Assemble error - 123: GR1,='a: unclosed quote
+../../../../as/err/err_123_literal_1.casl: 2: LAD GR1,='a
--- /dev/null
+../../../../casl2 ../../../../as/err/err_123_literal_1.casl
--- /dev/null
+Assemble error - 123: GR1,=': unclosed quote
+../../../../as/err/err_123_literal_2.casl: 2: LAD GR1,='
--- /dev/null
+../../../../casl2 ../../../../as/err/err_123_literal_2.casl
--- /dev/null
+Assemble error - 124: 'ab': more than one character in literal
+../../../../as/err/err_124_literal_1.casl: 2: LAD GR1,='ab'
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+../../../../casl2 ../../../../as/err/err_124_literal_1.casl
--- /dev/null
+Assemble error - 124: '''a': more than one character in literal
+../../../../as/err/err_124_literal_2.casl: 3: LAD GR2,='''a'
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+../../../../casl2 ../../../../as/err/err_124_literal_2.casl
-Assemble error - 126: '': syntax error in literal
-../../../../as/err/err_128.casl: 2: LAD GR1,=''
+Assemble error - 126: 'a'b': syntax error in character constant. In CASL II, two consecutive apostrophes ('') represent a single apostrophe (').
+../../../../as/err/err_126.casl: 3: DC 'a'b'
-../../../../casl2 ../../../../as/err/err_128.casl
+../../../../casl2 ../../../../as/err/err_126.casl
--- /dev/null
+Assemble error - 126: ''': syntax error in character constant. In CASL II, two consecutive apostrophes ('') represent a single apostrophe (').
+../../../../as/err/err_126_literal_2.casl: 2: LAD GR1,='''
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+../../../../casl2 ../../../../as/err/err_126_literal_2.casl
-casl2 error - 127: no source file
+
+Assemble ../../../../as/cmd/DC/dc__c2.casl (0)
+Assemble error - 127: '': empty character constant
+../../../../as/cmd/DC/dc__c2.casl: 4: DC ''
-../../../../casl2
+../../../../casl2 -atd -M128 ../../../../as/cmd/DC/dc__c2.casl
--- /dev/null
+Assemble error - 126: ''': syntax error in character constant. In CASL II, two consecutive apostrophes ('') represent a single apostrophe (').
+../../../../as/err/err_127_literal.casl: 2: LAD GR1,='''
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+../../../../casl2 ../../../../as/err/err_127_literal.casl
--- /dev/null
+casl2 error - 128: no source file
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+../../../../casl2