2012-09-20 2 views
4

"pyparsing"을 사용하여 "CREATE TABLE"다음에 세미콜론 (";")을 추가하고 있습니다.파이핑을 사용하여 주석 스캔을 수정하십시오.

CREATE TABLE A (B VARCHAR(255)) 
--Comment 

프로그램은 여기서 의견이처럼 주위에있을 때

CREATE TABLE A (B VARCHAR(255)); 

문제가 발생 :

CREATE TABLE A (B VARCHAR(255)) 

프로그램이 다음 출력을 줄 것이다 :이 입력이있는 경우 주는 :

CREATE TABLE A (B VARCHAR(255)) 
--Comment 
; 
import pyparsing as par 

alphanumsword = par.Word(par.alphanums + "_") 
element = "(" + alphanumsword + ")" | alphanumsword 
row = par.OneOrMore(element) 
rows = row + par.OneOrMore("," + row) | row 

semicolon = par.Literal(";") 
comment1 = par.Literal("--") + par.restOfLine + par.LineEnd() 

createtable = par.CaselessLiteral("create") + par.CaselessLiteral("table") 
       + alphanumsword + "("  + rows + ")" + ~semicolon 

createtable.ignore(comment1) 
createtable.ignore(par.cStyleComment) 

text = \ 
""" 
CREATE TABLE PERSON 
(
    /* Comment */ 
    /* 
     Comment 
    */ 
    ID VARCHAR(255), 
    NAME VARCHAR(255), -- Comment 
    --- Comment 
    ADDRESS VARCHAR(255) NULL, -- Comment 
    CONSTRAINT PK_PERSON PRIMARY KEY (ID) 
) 

-- Comment 

CREATE TABLE A (B VARCHAR(255)) 
""" 

text_list = list(text) 
offset = 0 

for t,s,e in createtable.scanString(text): 
    print "(", t, ",", s, ",", e, ")" 

    print "||", text[s:e], "||" 

    text_list.insert(e + offset, ';') 
    offset += 1 

print "".join(text_list) 

답변

2

사용 ~(semicolon | comment1) 대신 ~(semicolon) :다음은 코드입니다.

import pyparsing as par 

alphanumsword = par.Word(par.alphanums + "_") 

element = "(" + alphanumsword + ")" | alphanumsword 
#element = alphanumsword + "(" + alphanumsword + ")" | alphanumsword 

row = par.OneOrMore(element) 

rows = row + par.OneOrMore("," + row) | row 

semicolon = par.Literal(";") 

comment1 = par.Literal("--") + par.restOfLine + par.LineEnd() 

createtable = par.CaselessLiteral("create") + par.CaselessLiteral("table") \ 
       + alphanumsword + "("  + rows + ")" + ~(semicolon | comment1) 

createtable.ignore(comment1) 
createtable.ignore(par.cStyleComment) 


text = \ 
""" 
--- this is comment 

CREATE TABLE PERSON 
(
    /* Comment */ 
    /* 
     Comment 
    */ 
    ID VARCHAR(255), 
    NAME VARCHAR(255), -- Comment 
    --- Comment 
    ADDRESS VARCHAR(255) NULL, -- Comment 
    CONSTRAINT PK_PERSON PRIMARY KEY (ID) 
) 

-- Comment 

CREATE TABLE A (B VARCHAR(255)) --comment 
CREATE TABLE A (B VARCHAR(255)); 
CREATE TABLE A (B VARCHAR(255)) 
CREATE TABLE A (B VARCHAR(255)); 

--Commentasfkjaskfj 
""" 

text_list = list(text) 
offset = 0 

for t,s,e in createtable.scanString(text): 
    print "(***", t, ",", s, ",", e, "**)" 

    print "||\n", text[s:e], "\n||" 
    print "s: %d, e: %d" % (s, e) 

    text_list.insert(e + offset , ';') 
    offset += 1 

    print "******************************" 

print "".join(text_list) 

출력 :

(*** ['create', 'table', 'PERSON', '(', 'ID', 'VARCHAR', '(', '255', ')', ',', 'NAME', 'VARCHAR', '(', '255', ')', ',', 'ADDRESS', 'VARCHAR', '(', '255', ')', 'NULL', ',', 'CONSTRAINT', 'PK_PERSON', 'PRIMARY', 'KEY', '(', 'ID', ')', ')'] , 22 , 243 **) 
|| 
CREATE TABLE PERSON 
(
    /* Comment */ 
    /* 
     Comment 
    */ 
    ID VARCHAR(255), 
    NAME VARCHAR(255), -- Comment 
    --- Comment 
    ADDRESS VARCHAR(255) NULL, -- Comment 
    CONSTRAINT PK_PERSON PRIMARY KEY (ID) 
) 
|| 
s: 22, e: 243 
****************************** 
(*** ['create', 'table', 'A', '(', 'B', 'VARCHAR', '(', '255', ')', ')'] , 257 , 290 **) 
|| 
CREATE TABLE A (B VARCHAR(255)) 
|| 
s: 257, e: 290 
****************************** 
(*** ['create', 'table', 'A', '(', 'B', 'VARCHAR', '(', '255', ')', ')'] , 336 , 369 **) 
|| 
CREATE TABLE A (B VARCHAR(255)) 
|| 
s: 336, e: 369 
****************************** 

--- this is comment 

CREATE TABLE PERSON 
(
    /* Comment */ 
    /* 
     Comment 
    */ 
    ID VARCHAR(255), 
    NAME VARCHAR(255), -- Comment 
    --- Comment 
    ADDRESS VARCHAR(255) NULL, -- Comment 
    CONSTRAINT PK_PERSON PRIMARY KEY (ID) 
); 

-- Comment 

CREATE TABLE A (B VARCHAR(255)); --comment 
CREATE TABLE A (B VARCHAR(255)); 
CREATE TABLE A (B VARCHAR(255)); 
CREATE TABLE A (B VARCHAR(255)); 

--Commentasfkjaskfj 
관련 문제