<주어> ::= <명사> <조사>
| <명사>
<서술어> ::= <부사> <동사>
| <동사>
<목적어> ::= <명사> <조사>
<명사> ::= 내 | 너 | 그
<동사> ::= 가다 | 오다
<부사> ::= 빨리 | 늦게
<조사> ::= 을 | 를 | 이 | 가
<접속사> ::= 그리고 | 그러나 | 그런데 | 하지만
BNF로 만들 수 있는 문장
내가 가다.
내가 오다.
너가 가다.
너가 오다.
그가 가다.
그가 오다.
내가 가다. 그리고 너가 오다. 그러나 그는 가다.
BNF 언어 설계
<program> ::= <block-list>
//프로그램은 하나의 블록 리스트
<block-list> ::= <ident>(<ident-list>) {<decl> <statement>}
| <block-list> <ident> (<ident-list>) {<decl> <statement>}
/*
<ident> : 블록 이름
<decl> : 변수/상수 선언
<statement> : 연산/ 제어부분
*/
<ident-list> ::= <ident>
| <ident-list>, <ident>
/*
ident-list 예시
* ,를구분자로 사용
a, b, c, d, .., g
this_is_param
*/
<ident> ::= <ident> <ident-letter>
| <ident> <digit>
| <ident-letter>
/*
- ident의 예시
a
abbb
adasfwq53163
*/
<ident-letter> ::= a | b | c | ... | z | A | B | ... | Z
<digit> ::= 1 | 2 | 3 | ... | 9 | 0
<decl> ::= <def-decl> <var-decl>
| <decl> <def_decl> <var-decl>
<def-decl> ::= <ident> <number>
<var-decl> ::= <ident-list>;
| <var-assignment-list>;
/*
변수 선언부
<ident-list>; -> 변수명만 쓰고 ;로 끝냄
<var-assignment-list>; -> 변수명, 변수명, ... 변수명;
*/
<var-assignment-list> ::= <ident>=<number>
| <var-assignment-list>, <ident>=<number>
/*
변수 선언 문법
a=10
a=10, b=20, c=30
*/
<number> ::= <number> <digit>
// number : 십진수의 연속
<statement> ::= <ident>=<expression> //a=3, c=a+b
| <ident>(<ident-list>) //func(), func(a, b, c, d, e)
| (<statement-list>)
| if <condition> then <statement>
| while <condition> do <statement>
<statement-list> ::= <statement>
| <statement-list>; <statement>
<ident>=<expression>
<expression> ::= <term>
| <adding-operator> <term>
| <expression> <adding-operator> <term>
<adding-operator> ::= + | -
<term> ::= <factor>
| <term> <multiplying-operator> <factor>
<multiplying-operator> ::= * | /
<factor> ::= <ident>
| <number>
| (<expression>)
<codition> ::= not <expression>
| <expression> <relation> <expression>
<relation> ::= = | <> | < | > | <= | >= | ==
/*
if A > B then
C = A - B;
if A <= B then
C = B - A;
위 if문은 어셈블러어로 아래와 같이 컴파일 된다.
*/
if:
CMP A, B
BGT sub_a_b
BLET sub_b_a
sub_a_b:
SUB C, A, B
B end_if
sub_b_a:
SUB C, B, A
B end_if
end_if:
: