minishell parsing

Parsing

๊ทผ 2๋‹ฌ๊ฐ„ ๋ฏธ๋‹ˆ์…ธ ๊ณผ์ œ๋ฅผ ํ•˜๋ฉด๊ฑฐ ๊ฐ€์žฅ ์˜ค๋žœ์‹œ๊ฐ„ ๊ณ ๋ฏผํ–ˆ๋˜๊ฑด ํŒŒ์‹ฑ๋ถ€์ด๋‹ค(์‚ฌ์‹ค ์•„์ง๋„ ์™„๋ฒฝํ•˜์ง€ ์•Š๋‹ค). ํ•ด๋‹น ํฌ์ŠคํŠธ์—์„  ํŒŒ์‹ฑ์„ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์–ด๋– ํ•œ (์ž๋ž‘ํ•˜๊ณ ์‹ถ์€)๊ฐœ๋…์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€, ์ดํ›„์— ์–ด๋–ค๊ฐœ๋…์„ ํ†ตํ•ด ์ด๋ฅผ ๊ฐœ๋Ÿ‰ํ• ์ˆ˜ ์žˆ๋Š”์ง€ ์ ์–ด๋ณด๊ณ ์žํ•œ๋‹ค.

1. ๊ธฐ๋ณธ ๋™์ž‘๋ฐฉ์‹

img ๋ฌธ์ž์—ด์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์€ ํˆฌํฌ์ธํ„ฐ ๋ฐฉ์‹๊ณผ ํ”Œ๋ž˜๊ทธ๋ฐฉ์‹์„ ์‚ฌ์šฉ. idx๋Š” ์‹œ์ž‘์ , slide๋Š” ์˜คํ”„์…‹์ด๋‹ค.

  1. ์‹œ์ž‘์ ์—์„œ ์˜คํ”„์…‹์„ ์ฆ๊ฐ€์‹œ์ผœ ๊ฐ€๋ฉด์„œ ๋ฌธ์ž ํ•˜๋‚˜์”ฉ ํ™•์ธํ•œ๋‹ค.
  2. action_decider์—์„œ ๋ฌธ์ž์— ๋”ฐ๋ฅธ ๋™์ž‘๋ฐฉ์‹๋“ค(action_set)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ํŠน์ •ํ•œ ๋™์ž‘์„ ์š”๊ตฌํ•˜๋Š” ๊ธ€์ž(', ", |, > โ€ฆ) : ์ด์ „๊นŒ์ง€์˜ ์ž…๋ ฅ์„ ๋ฒ„ํผ๋กœ ์˜ฎ๊น€ or ์ƒˆ๋ฆฌ์ŠคํŠธ or flg์—ฌ๋ถ€ ํ™•์ธ ๋ฐ ์„ธํŒ…โ€ฆ
    • ์ผ๋ฐ˜ ๋ฌธ์ž, '๋‚ด๋ถ€์— ์žˆ์–ด์„œ ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง„ ๋ฌธ์ž : ++slide(J)
  3. ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋™์ž‘๋ฐฉ์‹๋“ค(action_set)์„ ์ฐจ๋ ˆ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • CJIJE : C : [idx, idx + slide)๋ฒ”์œ„ ๋ฌธ์ž์—ด์„ ๋ฒ„ํผ๋กœ ์˜ฎ๊น€ -> J : ++slide -> I : idx์œ„์น˜ slide๋กœ ์ด๋™ -> J : ++slide -> E : idx ~ idx + slide ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋Œ€์‘ value ์ฐพ์•„์„œ ๋ฒ„ํผ๋กœ ์˜ฎ๊น€
while (์ข…๋ฃŒ ํ”Œ๋ž˜๊ทธ) {
	char *action_set = action_decider(*line)
	// ์ „๋‹ฌ๋ฐ›์€ action_set์„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ํ•˜๋‚˜์”ฉ ์ˆ˜ํ–‰
	while (*action_set != '\0')
	{
		if (*action_set = 'C')
			[idx, idx + slide)๋ฒ”์œ„ ๋ฌธ์ž์—ด์„ buffer์— cat.;
		else if (*action_set = 'E')
			[idx, idx + slide)๊ฐ€ key์ธ ํ™˜๊ฒฝ๋ณ€์ˆ˜ value๋ฅผ buffer์— cat.;
		else if (*action_set = 'J')
			++slide;
		else if (*action_set = 'I')
			idx += slide; slide = 0;
		else if (*action_set = 'A')
			buffer์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๋ฆฌ์ŠคํŠธ ๋‚ด์šฉ์— ์ถ”๊ฐ€, buffer ์žฌํ• ๋‹น;
			...
		++action_set;
	}
}

์ด์™ธ์—๋„ ๋ช‡๊ฐœ์˜ ๋™์ž‘๋“ค์ด ์žˆ์ง€๋งŒ ๋™์ž‘์„ ์•Œ์•„๋ณด๋Š”๋ด ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ƒ๋žต.

2. ๋™์ž‘ ๊ฒฐ์ •(action_decider)

ํ•ด๋‹น ๋ถ€๋ถ„์—์„œ๋Š” action_decider์— ์ •์  ๋ณ€์ˆ˜ flgs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ”Œ๋ž˜๊ทธ๋“ค์€ ON/OFF ํ–ˆ๋‹ค.

์ด๋•Œ flg์˜ ์ข…๋ฅ˜๋Š” ', ", $, ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ด ์žˆ๊ณ , ๊ฐ ํ”Œ๋ž˜๊ทธ๋Š” flgs์— bitํ˜•ํƒœ(0b0001, 0b0010โ€ฆ)๋กœ ๋น„ํŠธ ์—ฐ์‚ฐ๋˜์–ด ์ €์žฅ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋ฅผ ์ทจํ•œ ์ด์œ ๋Š”

  1. ', "๋‚ด๋ถ€์— ์žˆ๋Š” ๊ธ€์ž๋“ค์€ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์— ๋“ค์–ด์˜จ ์ด์ „์— ์ด๋Ÿฌํ•œ ๋ฌธ์ž๋“ค์ด ๋“ค์–ด์™”๋Š”์ง€ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
  2. "๋‚ด๋ถ€์—์„œ๋Š” $๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๊ณ , ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•  ํŒŒ์ผ ์ด๋ฆ„๋„ ', "๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋“ฑ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ค‘์ฒฉ๋ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ตฌํ˜„ํ•œ ๋™์ž‘ ์˜ˆ์‹œ(์ผ๋ถ€)