Skip to content

Commit

Permalink
Add LPEG scanner/parser for .proto files.
Browse files Browse the repository at this point in the history
  • Loading branch information
Neopallium committed Jun 17, 2011
0 parents commit 66c3e2a
Show file tree
Hide file tree
Showing 12 changed files with 663 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
\.*.swp
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
lua-pb
=======

Lua Protocol Buffers.

Installing
----------

14 changes: 14 additions & 0 deletions check_proto.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

local lp = require"lpeg"
local parser = require"src.proto.parser"

-- read .proto file.
local f = assert(io.open(arg[1]))
local contents = f:read("*a")
f:close()

-- parse tokens.
assert(parser.check(contents))

print("Valid .proto file")

56 changes: 56 additions & 0 deletions dump_ast.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@

local lp = require"lpeg"
local scanner = require"src.proto.scanner"
local grammar = require"src.proto.grammar"
local parser = require"src.proto.parser"

local utils = require"utils"

-- read .proto file.
local f = assert(io.open(arg[1]))
local contents = f:read("*a")
f:close()

local function Cnode(ntype)
return function(name, ...)
print("create:", ntype)
local node = { name = name, ...}
node.ntype = ntype
return node
end
end

local captures = {
[1] = grammar.Ct,
Package = Cnode"root",
Import = function(file)
return { ntype = 'import', file = file }
end,
Option = function(name, value)
return { ntype = 'option', name = name, value = value }
end,
Message = Cnode"message",
Group = Cnode"group",
Field = Cnode"field",
Service = Cnode"service",
rpc = Cnode"rpc",

Name = grammar.C,
ID = grammar.C,
Constant = grammar.C,
}

local rules = {
--[1] = lp.V'Message',
}

local patt = lp.P(parser.apply(rules, captures))

--patt = (patt + scanner.ANY)^0
-- parse tokens.
local ast = assert(patt:match(contents))

print(utils.dump(ast))

print("Valid .proto file")

30 changes: 30 additions & 0 deletions dump_names.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@

local lp = require"lpeg"
local scanner = require"src.proto.scanner"
local grammar = require"src.proto.grammar"
local parser = require"src.proto.parser"

-- read .proto file.
local f = assert(io.open(arg[1]))
local contents = f:read("*a")
f:close()

local captures = {
Package = function(name, ...) print("Package:", name, ...); return name; end,
Message = function(name, ...) print("Message:", name, ...); return name; end,
Name = grammar.C,
ID = grammar.C,
}

local rules = {
--[1] = lp.V'Message',
}

local patt = lp.P(parser.apply(rules, captures))

--patt = (patt + scanner.ANY)^0
-- parse tokens.
assert(patt:match(contents))

print("Valid .proto file")

22 changes: 22 additions & 0 deletions dump_tokens.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

local lp = require"lpeg"
local scanner = require"src.proto.scanner"

local patt = lp.Ct(
--(lp.C(scanner.TOKEN) + scanner.SPACE + scanner.COMMENT)^0
(lp.C(scanner.ANY))^0
* (scanner.EOF + scanner.error"invalid character")
)

-- read .proto file.
local f = assert(io.open(arg[1]))

-- parse tokens.
local tokens = patt:match(f:read("*a"))
f:close()

-- dump tokens
for i=1,#tokens do
io.write(tokens[i])
end

29 changes: 29 additions & 0 deletions lua-pb-scm-0.rockspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/usr/bin/env lua

package = 'lua-pb'
version = 'scm-0'
source = {
url = '__project_git_url__'
}
description = {
summary = "Lua Protocol Buffers",
detailed = '',
homepage = '__project_homepage__',
license = 'MIT',
maintainer = "Robert G. Jakabosky",
}
dependencies = {
'lua >= 5.1',
'lpeg',
'leg',
}
build = {
type = 'none',
install = {
lua = {
['pb.proto.scanner'] = "src/proto/scanner.lua",
['pb.proto.grammar'] = "src/proto/grammar.lua",
['pb.proto.parser'] = "src/proto/parser.lua",
}
}
}
47 changes: 47 additions & 0 deletions media.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// This file is from: http://code.google.com/p/thrift-protobuf-compare

package serializers.protobuf;

option java_package = "serializers.protobuf";
option java_outer_classname = "MediaContentHolder";
option optimize_for = SPEED;

message Image {
required string uri = 1; //url to the thumbnail
optional string title = 2; //used in the html ALT
optional int32 width = 3; // of the image
optional int32 height = 4; // of the image
enum Size {
SMALL = 0;
LARGE = 1;
}
optional Size size = 5; // of the image (in relative terms, provided by cnbc for example)
}

message Media {
required string uri = 1; //uri to the video, may not be an actual URL
optional string title = 2; //used in the html ALT
optional int32 width = 3; // of the video
optional int32 height = 4; // of the video
optional string format = 5; //avi, jpg, youtube, cnbc, audio/mpeg formats ...
optional int64 duration = 6; //time in miliseconds
optional int64 size = 7; //file size
optional int32 bitrate = 8; //video
repeated string person = 9; //name of a person featured in the video
enum Player {
JAVA = 0;
FLASH = 0;
}
optional Player player = 10; //in case of a player specific media
optional string copyright = 11;//media copyright
}

message MediaContent {
repeated Image image = 1;
optional Media media = 2;
}

service MediaServer {
rpc updateMedia(MediaContent) returns(MediaContent);
}

136 changes: 136 additions & 0 deletions speed.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@

package benchmarks;

option optimize_for = SPEED;

message SpeedMessage1 {
required string field1 = 1;
optional string field9 = 9;
optional string field18 = 18;
optional bool field80 = 80 [default=false];
optional bool field81 = 81 [default=true];
required int32 field2 = 2;
required int32 field3 = 3;
optional int32 field280 = 280;
optional int32 field6 = 6 [default=0];
optional int64 field22 = 22;
optional string field4 = 4;
repeated fixed64 field5 = 5;
optional bool field59 = 59 [default=false];
optional string field7 = 7;
optional int32 field16 = 16;
optional int32 field130 = 130 [default=0];
optional bool field12 = 12 [default=true];
optional bool field17 = 17 [default=true];
optional bool field13 = 13 [default=true];
optional bool field14 = 14 [default=true];
optional int32 field104 = 104 [default=0];
optional int32 field100 = 100 [default=0];
optional int32 field101 = 101 [default=0];
optional string field102 = 102;
optional string field103 = 103;
optional int32 field29 = 29 [default=0];
optional bool field30 = 30 [default=false];
optional int32 field60 = 60 [default=-1];
optional int32 field271 = 271 [default=-1];
optional int32 field272 = 272 [default=-1];
optional int32 field150 = 150;
optional int32 field23 = 23 [default=0];
optional bool field24 = 24 [default=false];
optional int32 field25 = 25 [default=0];
optional SpeedMessage1SubMessage field15 = 15;
optional bool field78 = 78;
optional int32 field67 = 67 [default=0];
optional int32 field68 = 68;
optional int32 field128 = 128 [default=0];
optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"];
optional int32 field131 = 131 [default=0];
}

message SpeedMessage1SubMessage {
optional int32 field1 = 1 [default=0];
optional int32 field2 = 2 [default=0];
optional int32 field3 = 3 [default=0];
optional string field15 = 15 [default="FOOBAR!"];
optional bool field12 = 12 [default=true];
optional int64 field13 = 13;
optional int64 field14 = 14;
optional int32 field16 = 16;
optional int32 field19 = 19 [default=2];
optional bool field20 = 20 [default=true];
optional bool field28 = 28 [default=true];
optional fixed64 field21 = 21;
optional int32 field22 = 22;
optional bool field23 = 23 [ default=false ];
optional bool field206 = 206 [default=false];
optional fixed32 field203 = 203;
optional int32 field204 = 204;
optional string field205 = 205;
optional uint64 field207 = 207;
optional uint64 field300 = 300;
}

message SpeedMessage2 {
optional string field1 = 1;
optional int64 field3 = 3;
optional int64 field4 = 4;
optional int64 field30 = 30;
optional bool field75 = 75 [default=false];
optional string field6 = 6;
optional bytes field2 = 2;
optional int32 field21 = 21 [default=0];
optional int32 field71 = 71;
optional float field25 = 25;
optional int32 field109 = 109 [default=0];
optional int32 field210 = 210 [default=0];
optional int32 field211 = 211 [default=0];
optional int32 field212 = 212 [default=0];
optional int32 field213 = 213 [default=0];
optional int32 field216 = 216 [default=0];
optional int32 field217 = 217 [default=0];
optional int32 field218 = 218 [default=0];
optional int32 field220 = 220 [default=0];
optional int32 field221 = 221 [default=0];
optional float field222 = 222 [default=0.0];
optional int32 field63 = 63;

repeated group Group1 = 10 {
required float field11 = 11;
optional float field26 = 26;
optional string field12 = 12;
optional string field13 = 13;
repeated string field14 = 14;
required uint64 field15 = 15;
optional int32 field5 = 5;
optional string field27 = 27;
optional int32 field28 = 28;
optional string field29 = 29;
optional string field16 = 16;
repeated string field22 = 22;
repeated int32 field73 = 73;
optional int32 field20 = 20 [default=0];
optional string field24 = 24;
optional SpeedMessage2GroupedMessage field31 = 31;
}
repeated string field128 = 128;
optional int64 field131 = 131;
repeated string field127 = 127;
optional int32 field129 = 129;
repeated int64 field130 = 130;
optional bool field205 = 205 [default=false];
optional bool field206 = 206 [default=false];
}

message SpeedMessage2GroupedMessage {
optional float field1 = 1;
optional float field2 = 2;
optional float field3 = 3 [default=0.0];
optional bool field4 = 4;
optional bool field5 = 5;
optional bool field6 = 6 [default=true];
optional bool field7 = 7 [default=false];
optional float field8 = 8;
optional bool field9 = 9;
optional float field10 = 10;
optional int64 field11 = 11;
}
2 changes: 2 additions & 0 deletions src/proto/grammar.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

return require"leg.grammar"
Loading

0 comments on commit 66c3e2a

Please sign in to comment.