1

ばかげた質問で申し訳ありません。

次のような SQL スキーマがあります (たとえば)。

create table test_table (
    id integer not null,
    title text,
    primary key ("id")
);

create table test_table2 (
    id integer not null,
    subtitle text,
    some_wierd_count integer not null,
    primary key ("id")
);

このスキーマから、いくつかの情報のみが必要です。主キー、インデックス、「not null」は気にしません。テーブル名、フィールド名、タイプのみ。

私は次の醜いコードを書きましたが、それは機能しません:

私が思ったように、このコードはこのタイプを埋める必要があります:

data Schema = Schema { schemaTables :: [Table] } deriving (Show)

data Table = Table {
      tableName   :: String 
    , tableFields :: [Field]
    } deriving (Show)

data Field = Field {
      fieldName :: String
    , fieldType :: String
    } deriving (Show)

しかし、テーブル式の作成内のフィールドセクションを適切に解析する方法がわかりません。フィールド宣言の終わりを検出するにはどうすればよいですか?

4

1 に答える 1

1

わかりました、kqr の昆布で、私はついに気づきました:sepByコンビネーターを使用する必要があります。フィールド宣言でテーブルを解析するための私の最終的なコード:

tableParser :: P.Parser Table
tableParser = do
    P.manyTill P.anyChar $ P.stringCI "create table"
    P.skipWhile fieldGarbage
    n <- P.takeWhile (not . fieldGarbage)
    P.skipWhile fieldGarbage 
    P.char '(' 
    fs <- fieldParser `P.sepBy` P.char ','
    P.manyTill P.anyChar (P.char ';')
    return $ Table (C.unpack n) fs 

parseStr = do 
    P.skipWhile fieldGarbage
    P.takeWhile (not . fieldGarbage)

fieldParser :: P.Parser Field
fieldParser = do
    n <- parseStr
    t <- parseStr 
    P.takeTill (\c -> c == ',' || c == ';')
    return $ Field (C.unpack n) (C.unpack t)

助けてくれてありがとう。

于 2013-11-21T04:08:49.873 に答える