[This is an ongoing project, expect updates.]

In my make-my-own-ROS project, I want to ensure compatibility with the original ROS ecosystem, so I need to provide the same set of functionality like roscpp. This is can be achieved in a number of steps, of which the first is to convert the message definitions. Initially I want to use Rust for that, but upon discovering an online PEG debugger, I decided to use that first.

Procedure

Really simple. Just write grammar->test->change PEG->test->...

The final version of the PEG definition is posted below:

// ROS Message Definition Parser
// ==========================

file = (result)*
result = sp (comment / definition)* linebreak

_ "whitespace"
  = [ \t\n\r]*

sp "space"
  = $[ \t]*

linebreak = [\n\r]

types "types" = ("bool" / "uint8" / "float32" / "string" / "Header")

array "array" = types ("[]")

type "type" = array / types

identifier "identifier" = $[a-zA-Z_]+

constant "constant" = type sp identifier sp [=] sp [0-9]+

variable "variable" = (type / array) sp identifier sp ![=]
definition "definition" = (variable / constant)

string "string" = sp $[^\n\r]+

comment "comment" = (['#']) string

Result

Thanks to the amazing web-based PEG.js debugger by phrogz, I was able to visualize the result easily in my browser :) As you can see, all tokens are differentiated with different colors. The next step would be translating from grammar tree to Cap'n Proto code!

Final Result