Terminal
Constant Literal (키워드, identifier, number, operator)
Non-terminal
규칙을 기반으로, 터미널을 대체하는 symbol
Production
non-terminal이 어떻게 terminal로 대체되는지에 대한 규칙
Non-terminal : <A>
Terminal : 0, 1, <>
Production : <A> -> 0 <A>| 1<A> | <>
<A> => {<>, 0, 1, 00, 01, 01, 10, 11, 000, ... }
을 RE는 표현 못하지만 CFG는 표현할 수 있다.
ID = [a-z][0-9 a-z A-Z _]*
CFG는 더욱 더 어렵게 표현할 수밖에 없다.
<S> -> (<S>) | <>
<S> -> <>
<S> -> (<S>) => (<>) => "()"
<S> -> (<S>) => ((<S>)) => (()) => "(())"
S -> LE
L -> a | .. | z
E -> | 0 | 1 .. | 9 | a ..
E -> EE
💬 E -> EE 요건 모지?!
<S> -> a<A> | b<A> | c<A> .. | z<A>
<A> -> 0<A> | 1<A> | 2<A> .. | 9<A> | .. A<A> | .. |
G = ( , N, P, S )
: Terminals(알파벳들)의 유한한 집합
N : Non-Terminal의 유한한 집합
P : Production rule의 유한한 집합
S : Start Non-terminal ( S N )
= { a, b, c } // 3개의 알파벳
N = { <S>, <A>} // 2개 논 터미널
P = { <S> -> a<A>c, <A>->a<A>, <A>->b, <A>-> }
S = <S>
<S> -> a<A>c -> ac -> ac
<S> -> a<A>c -> aa<A>c -> aac -> aac
Derivation 할 때에는 => 을 사용한다. (production rule에는 -> )
EXP -> EXP + EXP
EXP -> EXP * EXP
EXP -> NUM
1 + 2 * 3 은 Valid한가? YES!
EXP => EXP EXP => EXP 3 =>EXP + EXP 3 => EXP + 2 3 => 1 + 2 * 3
EXP -> EXP + EXP
EXP -> EXP * EXP
EXP -> NUM
1 + 2 * 3 은 Valid한가?
EXP => EXP EXP => EXP + EXP EXP => 1 + EXP EXP => 1 + 2 EXP => 1 + 2 * 3