Minishell Parsing01

MiniShell ๊ณผ์ œ ํŒŒ์‹ฑ๋ถ€ ๊ตฌ์ƒโ€ฆ

ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•œ ์ดํ›„ ํŒŒ์‹ฑ๋ถ€์—์„œ ์•„์ฃผ ๋งŽ์€ ๋‚ด์šฉ์ด ์ถ”๊ฐ€๋˜๊ณ  ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๋ฌธ์„œ๋Š” ํ์ง€ํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋ฌธ์„œ์—์„œ ์ •๋ฆฌํ•œ๋‹ค.

1. ๊ฐœ์š”

Minishell์—์„œ ๊ฐ€์žฅ ๋ณต์žกํ•˜๊ณ  ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์€ ๋ถ€๋ถ„์€ ํŒŒ์‹ฑ๋ถ€๋ผ๊ณ  ํ•ด๋„ ๊ณผ์–ธ์€ ์•„๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•จ์— ์žˆ์–ด์„œ ๋งˆ๊ตฌ์žก์ด๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ณด๋‹ค๋Š”, ์ •๋ฆฌํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ๋งž์ถฐ์„œ ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š”๊ฒŒ ๋” ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•œ ๊ธธ์ด๋ผ ํŒ๋‹จ๋˜์–ด ํ•ด๋‹น ๊ธ€์„ ์ž‘์„ฑํ•œ๋‹ค.

2. Parsing ์ง„๋ฆฌํ‘œ

๋ฌธ์ž \ flag โ€™ Flg โ€ Flg $ Flg Flg ์—†์Œ
white ๋ฌด์‹œ ๋ฌด์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Œ€์ฒด, ๋ฐ”๋กœ๋’ค๋ฉด๊ทธ๋ƒฅ$ cat, ๋‹ค์Œ์ค„
โ€™ FlgOFF, cat ๋ฌด์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Œ€์ฒด, FlgON cat, FlgON
โ€ ๋ฌด์‹œ FlgOFF, cat ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Œ€์ฒด, FlgON cat, FlgON
$ ๋ฌด์‹œ ์ค‘์ฒฉ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Œ€์ฒด, FlgON cat, ํ™˜๊ฒฝ๋ณ€์ˆ˜
| ๋ฌด์‹œ ๋ฌด์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Œ€์ฒด, ๋‹ค์Œ๋ฆฌ์ŠคํŠธ cat, ๋‹ค์Œ๋ฆฌ์ŠคํŠธ
> ๋ฌด์‹œ ๋ฌด์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Œ€์ฒด, ๋‹ค์Œ์€ํŒŒ์ผ cat, ๋‹ค์Œ์€ํŒŒ์ผ
ยป ๋ฌด์‹œ ๋ฌด์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Œ€์ฒด, ๋‹ค์Œ์€ํŒŒ์ผ cat, ๋‹ค์Œ์€ํŒŒ์ผ
< ๋ฌด์‹œ ๋ฌด์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Œ€์ฒด, ๋‹ค์Œ์€ํŒŒ์ผ cat, ๋‹ค์Œ์€ํŒŒ์ผ
ยซ ๋ฌด์‹œ ๋ฌด์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Œ€์ฒด, ๋‹ค์Œ์€ํŒŒ์ผ cat, ๋‹ค์Œ์€ํŒŒ์ผ

๊ทธ๋ ‡๋‹ค๋ฉดโ€ฆ ์ด์ œ ์œ„์˜ ์กฐ๊ฑด๋“ค์„ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋Š๋ƒ

3. ๋™์ž‘๋ฐฉ์‹ ๋ฐ ์ˆ˜๋„์ฝ”๋“œ

์ˆ˜์ •.

CJI : catํ•˜๊ณ , jumpํ•˜๊ณ , Index๋ฅผ ์˜ฎ๊น€. -> ์ด์ „๊นŒ์ง€์˜ ํ…์ŠคํŠธ๋“ค์„ ๋ฒ„ํผ๋กœ ์˜ฎ๊ธฐ๊ณ , ++slideํ•˜๊ณ  index += slideํ•˜์—ฌ ๋ฐฉ๊ธˆ์˜ ๋ฌธ์ž๋ฅผ ๋‹ค์Œ cat์— ๋ฐ˜์˜๋˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.

๋ฌธ์ž \ flag โ€™ Flg โ€ Flg $ Flg โ€ \& $ Flg Flg ์—†์Œ
white J J E EIJ CJIAW
โ€™ FlgOFF / CJI J ECJI EIJ Flgset / CJI
โ€ J FlgOFF / CJI FlgON / EIJ Flgoff / EJI FlgON / CJI
$ J Flgset / CJI FlgON / EJI EJI CJI
| J J EJIN EIJ CJIN
> J J EJIN EIJ CJIN
ยป J J EJIN EIJ CJIN
< J J EJIN EIJ CJIN
ยซ J J EJIN EIJ CJIN
while(๋ฌธ์ž์—ด์ด ๋๋‚ ๋•Œ๊นŒ์ง€)
{
	// ๋‹ค์Œ์— ์˜ค๋Š” ๋ฌธ์ž๋ฅผ ๋ณด๊ณ  ์–ด๋–ป๊ฒŒ ํ–‰๋™ํ• ์ง€ + ํ”Œ๋ž˜๊ทธ ์žฌ์„ค์ •
	result = chk(&๋ฌธ์ž์—ด[idx + slide]);
	if (result == ๊ณต๋ฐฑ || ํŒŒ์ดํ”„ || ๋ผ๋‹ค์ด๋ ‰์…˜๋“ค || ์ฝ”ํŠธ๋“ค) {
		strlcat(cursor, ๋ฌธ์ž์—ด[idx], slide);
		idx += slide;
		slide = 0;
	}
	if (result == ๊ณต๋ฐฑ๋‚ ๋ฆฌ๊ธฐ) {
		while(๊ณต๋ฐฑ๋ฌธ์ž)
			++idx;
		cursor = newstr(ast->txt);
	}
	else if (result == ๋„˜์–ด๊ฐ€๊ธฐ)
		++slide;
	else if (result == ํ™˜๊ฒฝ๋ณ€์ˆ˜ cat) {
		env_vlaue = findenv(env, ๋ฌธ์ž์—ด[idx], slide);
		strcat(cursor, env_value);
		++idx;
	}
	else if (result == ํŒŒ์ดํ”„) {
		๋‹ค์Œ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ฆ, ํƒ€์ž…์€
		cousor = addone...();
		++idx;
	}
	else if (result == ๋ฆฌ๋‹ค์ด๋ ‰์…˜) {
		ast์ถ”๊ฐ€;
		set_redirec_type(ast, result);
		++idx;
		if (result == <<, >>)
			++idx;
	}
}
// ๋‹จ์–ด๋ฅผ ์ฝ๊ณ  ๊ฒ€์ฆ์„ ์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜.
int request(char **line) {

	return responese()
}

// ์ •์ ์ธ ํ”Œ๋ž˜๊ทธ์™€, ๋ฐ›์€ ์š”์ฒญ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ–‰๋™์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜.
// ์ด๋•Œ ์˜ˆ๋ฅผ ๋“ค๋ฉด ํŒŒ์ดํ”„ํ™•์ธ ์š”์ฒญ ์‹ ํ˜ธ์™€ ํŒŒ์ดํ”„์— ์ ํ•ฉํ•œ ํ–‰๋™์„ ํ•˜๋ผ๋Š” ์‹ ํ˜ธ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์กฐ๊ฑด๋ฌธ์ฒ˜๋ฆฌ ํ•  ํ•„์š” ์—†์ด ์ž…๋ ฅ์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.
int response(char ) {
	static flgs = 0b00000000;
	// ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ค‘์ฒฉ๋˜๋Š”๊ฑด DQ์—์„œ DL์ƒํƒœ ๋ฟ์ด๋‹ค.
	if (SQํ”Œ๋ž˜๊ทธ ON์ƒํƒœ) {
		SQ์ž…๋ ฅ์ž…๋ ฅ์‹œ catํ•˜๊ฒŒ ํ•˜๊ณ (์˜๋ฏธ๋ฅผ ๊ฐ€์ง = ์ž…๋ ฅ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜)
		์ด์™ธ์—๋Š” ์ „๋ถ€ ๋ฌด์‹œํ•˜๋Š” ๋™์ž‘ ๋ฐ˜ํ™˜
	}
	else if (DQํ”Œ๋ž˜๊ทธ ON์ƒํƒœ) {
		์šฐ์„  DQ์‹œ catํ•˜๊ฒŒ ํ•˜๋Š” ๋™์ž‘ ๋ฐ˜ํ™˜ํ•˜๊ณ 
		DL๋งŒ ์ค‘์ ‘ํ”Œ๋ž˜๊ทธ ์‹œํ‚ค๊ณ , ๋‚˜๋จธ์ง€๋Š” ๋ฌด์‹œ ๋™์ž‘ ๋ฐ˜ํ™˜
	}
	else if (DLํ”Œ๋ž˜๊ทธ ON์ƒํƒœ) {
		ํ™”์ดํŠธ : flg unset(cat)
		DQ, SQ, DL : flg unset(cat) + flg set
		ํŒŒ์ดํ”„, ๋ฆฌ๋‹ค์ด๋ ‰์…˜ : flg unset(cat) + ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜(๊ฐ€๋Šฅํ•œ๊ฐ€...?) -> flgํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ ๋“ฏ?
	}
	else {
		๊ฐ ํ”Œ๋ž˜๊ทธ ์ž…๋ ฅ์ด๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ setํ•œ๋‹ค.
		ํŒŒ์ดํ”„ ๋ฐ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ธ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
	}
}

flg๊ฐ€ ๋ณ€ํ™”(ON->OFF, OFF->ON)์ด ๋˜๋ฉด ์ผ๋‹จ ๊ฑฐ๊ธฐ๊นŒ์ง€ cat์„ ํ•œ๋‹ค. echo "Hi$PATH hello"์˜ ๊ฒฝ์šฐ $๋ฅผ ๋งŒ๋‚˜๋Š” ์ˆœ๊ฐ€ Hi๊นŒ์ง€ cat, $์ดํ›„ ํ™”์ดํŠธ์ŠคํŽ˜์ด์Šค(๊ณต๋ฐฑ)๊นŒ์ง€ ๊ฐ€์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฐพ๊ณ  cat, ๋งˆ์ง€๋ง‰์œผ๋กœ "๋ฅผ ๋งŒ๋‚˜์„œ "ํ”Œ๋ž˜๊ทธ๊ฐ€ OFF๋˜๋ฉด hello๋ฅผ cat

$?

$? should expands to the exit status of the most recently executed foreground pipeline.

foreground pipeline : ํฌ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋œ ํŒŒ์ดํ”„ ์ฆ‰, minishell์—์„œ $?๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด