zoukankan      html  css  js  c++  java
  • SQL语言的SELECT语句的正规式分析

    以下为本人做的SQL词法分析器初步规则的设计,当然有些可能有些错误,可能需要后期修改

    SQL语句->SELECT语句|UPDATE语句|DELETE语句|INSERT语句

    ->[a-zA-Z]+[0-9]*(_)[a-zA-Z]+[0-9]*

    SELECT语句->SELECT语句 [UNION|UNION ALL] SELECT语句|SELECT (DISTINCT) 字段 FROM 表名 (分组) (连接) (WHERE 条件) (排序)

    表名->|SELECT语句 (AS)

    字段->字段(,字段)||*|(CASE语句 (AS ))

    表名->|(SELECT语句 AS )

    条件->条件( OR|AND 条件)| 比较条件

    比较条件->>|<|>=|<=|=|<>|LIKE

    分组->GROUP BY 字段 (HAVING 条件)

    排序->ORDER BY 字段 (ASC|DESC)

    连接->[LEFT JOIN|LEFT OUTER JOIN|RIGHT JOIN|RIGHT OUTER JOIN|INNER JOIN|FULL JOIN] 表名 ON 条件

    CASE语句->CASE [WHEN 条件 THEN ]+ (ELSE ) END | CASE 条件 [WHEN THEN ]+ (ELSE ) END

     

    非终结符替换

    代号

    代替的值

    状态

    A

    SELECT语句

    S1

    B

    表名

    S2

    C

    字段

    S3

    D

    分组

    S4

    E

    连接

    S5

    F

    条件

    S6

    G

    排序

    S7

    H

    S8

    I

    CASE语句

    S9

    J

    比较条件

    S10

    K

    关键字

    S11

     

    终结符替换(关键字)

    终结符

    状态

    WHEN

    C1

    SELECT

    C2

    DISTINCT

    C3

    FROM

    C4

    WHERE

    C5

    LEFT JOIN

    C6

    LEFT OUTER JOIN

    C7

    RIGHT JOIN

    C8

    RIGHT OUTER JOIN

    C9

    INNER JOIN

    C10

    FULL JOIN

    C11

    HAVING

    C12

    ASC

    C13

    DESC

    C14

    CASE

    C15

    END

    C16

    ELSE

    C17

    ON

    C18

    UNION

    C19

    UNION ALL

    C20

    AS

    C21

    ORDER BY

    C22

    GOURP BY

    C23

    OR

    C24

    AND

    C25

    THEN

    C26

    LIKE

    C27

     

    推导式变为:

    A->A C19 A|A C20 A|C2 (C3) C C4 B (D) (E) (C5 F) (G)

    B->H|A C21 H

    C->C(,C)|H|*|(I (C21 H))

    D->C22 C (C12 F)

    E->[C6|C7|C8|C9|C10|C12] B C18 F

    F->F (C24|C25 F)|H J H

    G->C23 C (C13|C14)

    LETTER->A|B|…|Z|a|b|…|c

    DIGIT->0|1|…|9

    H->LETTER(LETTER|DIGIT)*

    I->C15[ C1 F C26 H]+ (C17 H) C16|C15 C [C1 H THEN H ]+( C17 H) C16

    J->>|<|>=|<=|=|<>|LIKE

     

    消除A的直接左递归

    A->C2 (C3) C C4 B (D) (E) (C5 F) (G) P1

    P1->C19 A P1|ε

     

    消除F的直接左递归

    F-> H J H P2

    P2-> (C24|C25 F) P2|ε

     

    消除C的直接左递归

    C-> (H|*|(I (C21 H))) P3

    P3->(,C) P3|ε

  • 相关阅读:
    PKU 3984 迷宫问题
    九度 1341 艾薇儿的演唱会
    九度 1335
    SDUT 1198 鞍点计算
    POJ 1363 Rails
    SDUT 1570 C旅行
    HDU 1042 N!
    SDUT 1568 俄罗斯方块
    HDU 1257 最少拦截系统
    POJ 3750 小孩报数问题
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2131378.html
Copyright © 2011-2022 走看看