68 lines
1.6 KiB
Ruby
68 lines
1.6 KiB
Ruby
|
# -*- coding: utf-8 -*- #
|
||
|
# frozen_string_literal: true
|
||
|
|
||
|
module Rouge
|
||
|
module Lexers
|
||
|
class Prolog < RegexLexer
|
||
|
title "Prolog"
|
||
|
desc "The Prolog programming language (http://en.wikipedia.org/wiki/Prolog)"
|
||
|
tag 'prolog'
|
||
|
aliases 'prolog'
|
||
|
filenames '*.pro', '*.P', '*.prolog', '*.pl'
|
||
|
mimetypes 'text/x-prolog'
|
||
|
|
||
|
start { push :bol }
|
||
|
|
||
|
state :bol do
|
||
|
rule %r/#.*/, Comment::Single
|
||
|
rule(//) { pop! }
|
||
|
end
|
||
|
|
||
|
state :basic do
|
||
|
rule %r/\s+/, Text
|
||
|
rule %r/%.*/, Comment::Single
|
||
|
rule %r/\/\*/, Comment::Multiline, :nested_comment
|
||
|
|
||
|
rule %r/[\[\](){}|.,;!]/, Punctuation
|
||
|
rule %r/:-|-->/, Punctuation
|
||
|
|
||
|
rule %r/"[^"]*"/, Str::Double
|
||
|
|
||
|
rule %r/\d+\.\d+/, Num::Float
|
||
|
rule %r/\d+/, Num
|
||
|
end
|
||
|
|
||
|
state :atoms do
|
||
|
rule %r/[[:lower:]]([[:word:]])*/, Str::Symbol
|
||
|
rule %r/'[^']*'/, Str::Symbol
|
||
|
end
|
||
|
|
||
|
state :operators do
|
||
|
rule %r/(<|>|=<|>=|==|=:=|=|\/|\/\/|\*|\+|-)(?=\s|[a-zA-Z0-9\[])/,
|
||
|
Operator
|
||
|
rule %r/is/, Operator
|
||
|
rule %r/(mod|div|not)/, Operator
|
||
|
rule %r/[#&*+-.\/:<=>?@^~]+/, Operator
|
||
|
end
|
||
|
|
||
|
state :variables do
|
||
|
rule %r/[A-Z]+\w*/, Name::Variable
|
||
|
rule %r/_[[:word:]]*/, Name::Variable
|
||
|
end
|
||
|
|
||
|
state :root do
|
||
|
mixin :basic
|
||
|
mixin :atoms
|
||
|
mixin :variables
|
||
|
mixin :operators
|
||
|
end
|
||
|
|
||
|
state :nested_comment do
|
||
|
rule %r(/\*), Comment::Multiline, :push
|
||
|
rule %r/\s*\*[^*\/]+/, Comment::Multiline
|
||
|
rule %r(\*/), Comment::Multiline, :pop!
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|