SmileyFuck的GitHub已经建好了。
就在不到半个小时前,我实现了SmileyFuck初步的词法分析。
我从lex源代码中截取一段出来。这些是SmileyFuck中会用到的token,前面的字符串或正则表达式表示它的形式,后面的返回值表示它的标志:
[ \t] return SPACE;
":" return COLON;
";" return SEMICOL;
"," return COMMA;
"-" return MINUS;
"(" return LP;
")" return RP;
"D" return DCAP;
"." return DOT;
[Oo] return OLETTER;
"*" return ASTER;
"=" return EQUAL;
"_" return USC;
"^" return CARET;
"<" return LAQ;
">" return RAQ;
"~" return TILDE;
[Yy] return YLETTER;
"\n" return CR;
又从yacc源代码中取得巴克斯范式:
smiley_total
: smiley_total SPACE smiley
| smiley CR
| smiley_total CR
;
smiley
: emotion
| icon
;
emotion
: emotion_without_hair
| e_hair emotion
;
e_hair
: EQUAL
;
emotion_without_hair
: e_eye e_mouth
| e_eye e_nose e_mouth
;
e_eye
: COLON
| SEMICOL
;
e_nose
: MINUS
| COMMA
;
e_mouth
: LP
| RP
| DCAP
| OLETTER
| ASTER
;
icon
: i_eyel i_mouth i_eyer
| i_cheekl i_eyel i_mouth i_eyer i_cheekr
| i_shapel i_eyel i_mouth i_eyer i_shaper
| i_shapel i_cheekl i_eyel i_mouth i_eyer i_cheekr i_shaper
| i_arml i_shapel i_eyel i_mouth i_eyer i_shaper i_armr
;
i_mouth
: USC
| OLETTER
| DOT
;
i_eyel
: i_eye
| RAQ
;
i_eyer
: i_eye
| LAQ
;
i_eye
: CARET
| TILDE
| MINUS
| OLETTER
;
i_cheekl
: i_cheek
;
i_cheekr
: i_cheek
;
i_cheek
: ASTER
| EQUAL
;
i_shapel
: LP
;
i_shaper
: RP
;
i_arml
: i_arm
;
i_armr
: i_arm
;
i_arm
: YLETTER
| OLETTER
;
可以用巴克斯范式套进之前构想中所用到的符号试试。解释一些表情就是这么简单。
可是,我实现的只有词法分析器呢,也就是说,它只会检查语法,如果没有问题,就什么也不说;直到查到问题才会报警。
网友评论