class WikiParser start page token ProperName Word ListStart EndOfLine EndOfFile EndOfParagraph OpenAngle URL CloseAngle Punctuation rule page: bodyparts EndOfFile { puts val[0]; yyaccept } bodyparts: bodypart bodyparts { result = val[0] + val[1] } | { result = "" } bodypart: list { result = val[0] } | paragraph { result = val[0] } list: ListStart paragraph { result = "
  • #{val[1]}
  • " } paragraph: words EndOfParagraph { if !val[0].empty? then result = "

    #{val[0].join(" ")}

    " else result = "" end } words: propernamephrase words { result = val[1].unshift(val[0]) } | link words { result = val[1].unshift(val[0]) } | Word words { result = val[1].unshift(val[0]) } | { result = [] } propernamephrase: ProperName Word { result = val[1].unshift(val[0]) } | ProperName Punctuation { result = val[1].unshift(val[0]) } link: ProperName OpenAngle URL CloseAngle ---- header require "wiki-lexer" ---- inner def parse( str ) @lexer = WikiLexer.new(str) @yydebug = true ##### do_parse end def next_token tok = @lexer.next_token if tok.nil? [:EndOfFile, :EndOfFile] else if tok.size == 1 then [tok[0], tok[0]] else tok end end end def on_error(token, value, stack) puts "Error on #{value} after #{stack.inspect} in state #{token}" raise Racc::ParseError end ---- footer if $0 == __FILE__ then $DEBUG=true src = IO.read('a') puts "parsing:" puts src WikiParser.new.parse(src) end