Lexer works. TODO: Write a parser.

This commit is contained in:
Netscape Navigator 2020-03-19 22:14:13 -05:00
parent fb0fdbfdb1
commit d8ec5867c0
1 changed files with 39 additions and 19 deletions

58
dist/pigeon/lexer.rb vendored
View File

@ -26,7 +26,7 @@ module Pigeon
KIND = /kind #{ALPHANUMERICISH}\n/
BODY_ENTRY = /#{ALPHANUMERICISH}:#{ANY_VALUE}\n/
FOOTER_ENTRY = /signature .*{40,90}\.sig\.ed25519/
FOOTER_ENTRY = /signature .*{40,90}\.sig\.ed25519\n/
LEXER_STATES = [HEADER = :header, BODY = :body, FOOTER = :footer]
@ -35,6 +35,19 @@ module Pigeon
new(bundle_string).tokenize
end
def tokenize
until scanner.eos?
puts scanner.matched || "No match"
case @state
when HEADER then do_header
when BODY then do_body
when FOOTER then do_footer
end
end
end
private
def initialize(bundle_string)
@bundle_string = bundle_string
@scanner = StringScanner.new(bundle_string)
@ -42,6 +55,14 @@ module Pigeon
@state = HEADER
end
def flunk!
raise "Syntax error at #{scanner.pos}"
end
def add_terminator!
@tokens << [:TERMINATOR]
end
def do_header
if scanner.scan(AUTHOR)
author = scanner.matched.chomp.gsub("author ", "")
@ -69,11 +90,10 @@ module Pigeon
if scanner.scan(SEPERATOR)
@state = BODY
@tokens << [:TERMINATOR]
add_terminator!
return
end
raise "Malformed header at line #{scanner.pos}"
flunk!
end
def do_body
@ -85,28 +105,28 @@ module Pigeon
if scanner.scan(SEPERATOR)
@state = FOOTER
@tokens << [:TERMINATOR]
add_terminator!
return
end
raise "Malformed body entry at position #{scanner.pos}"
flunk!
end
def do_footer
puts @tokens.inspect
raise "This is the last thing I need to do."
end
# Reset the lexer to ingest the next entry.
# If scanner.eos? == true, it will just terminate.
def tokenize
puts bundle_string
until scanner.eos?
case @state
when HEADER then do_header
when BODY then do_body
when FOOTER then do_footer
else
raise "Lexing failed at #{scanner.pos}"
end
if scanner.scan(FOOTER_ENTRY)
sig = scanner.matched.strip.gsub("signature ", "")
@tokens << [:SIGNATURE, sig]
return
end
if scanner.scan(SEPERATOR)
@state = HEADER
add_terminator!
else
raise "Parse error at #{scanner.pos}. Did you add two carriage returns?"
end
end
end