Compiler
변형된 마크다운 개발하기(1) grammar 제작
GuTTe
2020. 7. 10. 01:21
[해결] 수정 계획 : 아래 grammar 실패작 곧 정상적인 grammar 들고올 예정
기존 마크다운은 #, ##, ###와 >, >>, >>> 등등의 grammar을 제공한다.
이번에는 이러한 grammar을 제쳐두고 새로운 grammar을 제시할 생각이다.
#,##,###와 같은 Header은 H1->{"문자열"}, H2->{"문자열"}로 변경할 것이고
>, >>와 같은 Quote는 Quote->{"인용구"}로
Link와 Image는 Link->{"이름","링크 주소", "툴팁"}의 형태로 제공될 예정이다.
아래는 grammar에 대한 CFG이다.
mddoc : paragraphs opt_terms
;
paragraphs : /* None */
| paragraph
| paragraphs terms paragraph
;
paragraph : keyword_paragraph op_rasgn '{' pcontents opt_terms '}'
;
pcontents : pcontent
| pcontents terms pcontent
;
pcontent : keyword_header_one op_rasgn '{' ptext opt_terms '}'
| keyword_header_two op_rasgn '{' ptext opt_terms '}'
;
ptext : pstring
;
pstring : lit_string
;
opt_terms : /* None */
| terms
;
terms : term
| terms term
;
term : '\n'
| ' '
| '\t'
;
코드를 보면 Pcon 구조체와 Para구조체를 볼 수 있다. Pcon구조체는 H1, H2, Quote과 같은 하나의 문단안에 content를 연결리스트로 연결하는 부분이다.
paragraph -> NEWLINE | pcontent 부분에서 NEWLINE을 만나면 연결된 Pcon구조체 리스트를 Para구조체에 대입한다.
고민했던 사항들은 H1->{Quote->{"인용구"}} 와 같이 되어있을 경우도 고려해봤지만 리스팅빼고는 딱히 쓸일이 없을거 같아서 제외시켰다.
그리고 아래와 같이 opt_term을 두어 입력할 문자열의 위치를 좀 더 자유롭게 선정하기로 결정했다.
H1->{"문자열"}
H2->{
"문자열"
}
H3->
{
"문자열"
}
좀 더 수정할 건 수정해야하는 grammar이다.