• 递归下降语法分析程序设计与实现


    制作一个简单的C语言词法分析程序_用c语言编写词法分析程序-CSDN博客文章浏览阅读276次。C语言的程序中,有很单词多符号和保留字。一些单词符号还有对应的左线性文法。所以我们需要先做出一个单词字符表,给出对应的识别码,然后跟据对应的表格来写出程序。_用c语言编写词法分析程序https://blog.csdn.net/lijj0304/article/details/134078944前置程序词法分析器参考这个帖子⬆️

    1.程序目标

    递归下降实现的语法分析程序,程序可以识别词法分析程序的输出文件中的二元序列,拼凑出用户输入的算式,然后通过递归下降的方式从中识别算术表达式是否正确,在错误位置输出提示。算式的语法如下:

    G[S]:S→V=E        E→TE′        E′→ATE|ε        T→FT′        T′→MFT′|ε        F→ (E)|i        A→+|-M→*|/        V→i

    2.程序设计

    程序会分析analyze文件,根据二元式拼凑出原本的输入str,然后把算式中的变量转换成i,同时在结尾处加上结束符号#,方便运算。同时程序还设计了一个全局变量flag用于标记当前递归下降分析器的状态,如果出错则会把flag置为1。

    完整的程序运行顺序如下:

    1. 读入分析的二元式获得用户输入
    2. 转换变量,加上结束符
    3. 递归下降分析,输出结论

    3.递归下降详细设计

    首先我根据给定的语法,计算处所需要用到的first集和follow集

    first

    follow

    S

    i

    #

    E

    (, i

    #, )

    E’

    +, -, ε

    #, )

    T

    (, i

    +, -, #, )

    T’

    *, /, ε

    +, -, #, )

    F

    (, i

    *, /, +, -, #, )

    A

    +, -

    (, i

    M

    *, /

    (, i

    V

    i

    =

    S的递归下降分析程序设计:

    E的递归下降分析程序设计:

    E’的递归下降分析程序设计:

    T的递归下降分析程序设计:

    T’的递归下降程序设计:

    F的递归下降程序设计:

    A的递归下降程序设计:

    M的递归下降程序设计:

    V的递归下降程序设计:

    4.完整程序 

    1. #include
    2. #include
    3. #include
    4. #define MAX_LEN 1000
    5. char str[MAX_LEN];
    6. int i, j, flag;
    7. void S();
    8. void E();
    9. void E1();
    10. void T();
    11. void T1();
    12. void F();
    13. void A();
    14. void M();
    15. void V();
    16. void S() {
    17. if(flag == 0) {
    18. printf("S->");
    19. if(str[i] == 'i') {
    20. V();
    21. if(flag == 0 && str[i] == '=') {
    22. i++;
    23. E();
    24. }
    25. else {
    26. flag = 1;
    27. printf("error\n");
    28. }
    29. }
    30. else {
    31. flag = 1;
    32. printf("error\n");
    33. }
    34. }
    35. }
    36. void E() {
    37. if(flag == 0) {
    38. printf("E->");
    39. if(str[i] == '(' || str[i] == 'i') {
    40. T();
    41. if(flag == 0) {
    42. if(str[i] == '+' || str[i] == '-')
    43. E1();
    44. else if(str[i] == ')' || str[i] == '#')
    45. return;
    46. else {
    47. flag = 1;
    48. printf("error\n");
    49. }
    50. }
    51. }
    52. else {
    53. flag = 1;
    54. printf("error\n");
    55. }
    56. }
    57. }
    58. void E1() {
    59. if(flag == 0) {
    60. printf("E'->");
    61. if(str[i] == '+' || str[i] == '-') {
    62. A();
    63. if(flag == 0) {
    64. if(str[i] == '(' || str[i] == 'i') {
    65. T();
    66. if(flag == 0){
    67. if(str[i] == '+' || str[i] == '-')
    68. E1();
    69. else if(str[i] == ')' || str[i] == '#')
    70. return;
    71. else {
    72. flag = 1;
    73. printf("error\n");
    74. }
    75. }
    76. }
    77. else{
    78. flag = 1;
    79. printf("error\n");
    80. }
    81. }
    82. }
    83. else if(str[i] == ')' || str[i] == '#')
    84. return;
    85. else {
    86. flag = 1;
    87. printf("error\n");
    88. }
    89. }
    90. }
    91. void T() {
    92. if(flag == 0) {
    93. printf("T->");
    94. if(str[i] == '(' || str[i] == 'i') {
    95. F();
    96. if(flag == 0) {
    97. if(str[i] == '*' || str[i] == '/')
    98. T1();
    99. else if(str[i] == '+' || str[i] == '-' || str[i] == ')' || str[i] == '#')
    100. return;
    101. else {
    102. flag = 1;
    103. printf("error\n");
    104. }
    105. }
    106. }
    107. else {
    108. flag = 1;
    109. printf("error\n");
    110. }
    111. }
    112. }
    113. void T1() {
    114. if(flag == 0) {
    115. printf("T'->");
    116. if(str[i] == '*' || str[i] == '/') {
    117. M();
    118. if(flag == 0) {
    119. F();
    120. if(flag == 0)
    121. T1();
    122. }
    123. }
    124. else if(str[i] == '+' || str[i] == '-' || str[i] == ')' || str[i] == '#')
    125. return;
    126. else {
    127. flag = 1;
    128. printf("error\n");
    129. }
    130. }
    131. }
    132. void F() {
    133. if(flag == 0){
    134. printf("F->");
    135. if(str[i] == '(') {
    136. i++;
    137. if(str[i] == '(' || str[i] == 'i') {
    138. E();
    139. if(flag == 0) {
    140. if(str[i] == ')')
    141. i++;
    142. else {
    143. flag = 1;
    144. printf("error\n");
    145. }
    146. }
    147. }
    148. else {
    149. flag = 1;
    150. printf("error\n");
    151. }
    152. }
    153. else if(str[i] == 'i') {
    154. i++;
    155. }
    156. else {
    157. flag = 1;
    158. printf("error\n");
    159. }
    160. }
    161. }
    162. void A() {
    163. if(flag == 0) {
    164. printf("A->");
    165. if(str[i] == '+' || str[i] == '-')
    166. i++;
    167. else {
    168. flag = 1;
    169. printf("error\n");
    170. }
    171. }
    172. }
    173. void M() {
    174. if(flag == 0) {
    175. printf("M->");
    176. if(str[i] == '*' || str[i] == '/')
    177. i++;
    178. else {
    179. flag=1;
    180. printf("error\n");
    181. }
    182. }
    183. }
    184. void V() {
    185. if(flag == 0){
    186. printf("V->");
    187. if(str[i] == 'i')
    188. i++;
    189. else{
    190. flag = 1;
    191. printf("error\n");
    192. }
    193. }
    194. }
    195. int main() {
    196. for(int m = 1; m <= 4; m++) {
    197. printf("test%d:\n", m);
    198. char txt[] = "./lexical/analyze";
    199. char num[6];
    200. sprintf(num, "%d.txt", m);
    201. strcat(txt, num);
    202. FILE *fp = fopen(txt, "r");
    203. char buf[MAX_LEN] = "";
    204. char input[MAX_LEN] = "";
    205. fgets(buf, MAX_LEN, fp);
    206. i = 0, j = 0;
    207. for(int k = 0; k < strlen(buf); k++) {
    208. if(buf[k] == '1' && buf[k+1] == ',') {
    209. str[i++] = 'i';
    210. k += 3;
    211. while(1) {
    212. if(buf[k] == ')' && buf[k+1] == ' ')
    213. break;
    214. input[j++] = buf[k++];
    215. }
    216. continue;
    217. }
    218. if(buf[k] == ',' && buf[k+1] == ' ') {
    219. k += 2;
    220. while(1) {
    221. if(buf[k] == ')' && buf[k+1] == ' ')
    222. break;
    223. str[i++] = buf[k];
    224. input[j++] = buf[k++];
    225. }
    226. }
    227. }
    228. printf("Input scentence: %s\n", input);
    229. str[i] = '#', input[j] = '#';
    230. fclose(fp);
    231. flag = 0, i = 0;
    232. S();
    233. if(str[i] == '#' && flag == 0) {
    234. printf("end\n");
    235. printf("Gramma legal: %s\n", str);
    236. }
    237. else
    238. printf("Gramma illegal\n");
    239. }
    240. return 0;
    241. }

    5.运行示例

  • 相关阅读:
    MYSQL介绍——排序分页与索引
    python数据管理和分析
    C的内联函数(C99)
    C++ 函数
    用 Python 这样去创建词云不是更美嘛?
    java-StringBuilder
    渗透测试——2
    MATLAB | 19a到22a之间都更新了哪些绘图新特性?
    HTML5 新元素
    【大学复健】常用排序算法的原理与代码
  • 原文地址:https://blog.csdn.net/lijj0304/article/details/134331022