[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.
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
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!