blob: afdd766235a81f65c48b5d4c9e957cbe888f0ad4 [file] [log] [blame]
# -*- coding: utf-8 -*- #
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'
def self.analyze_text(text)
return 0.1 if text =~ /\A\w+(\(\w+\,\s*\w+\))*\./
return 0.1 if text.include? ':-'
end
state :basic do
rule /\s+/, Text
rule /^#.*/, Comment::Single
rule /\/\*/, Comment::Multiline, :nested_comment
rule /[\[\](){}|.,;!]/, Punctuation
rule /:-|-->/, Punctuation
rule /"[^"]*"/, Str::Double
rule /\d+\.\d+/, Num::Float
rule /\d+/, Num
end
state :atoms do
rule /[[:lower:]]([_[:word:][:digit:]])*/, Str::Symbol
rule /'[^']*'/, Str::Symbol
end
state :operators do
rule /(<|>|=<|>=|==|=:=|=|\/|\/\/|\*|\+|-)(?=\s|[a-zA-Z0-9\[])/,
Operator
rule /is/, Operator
rule /(mod|div|not)/, Operator
rule /[#&*+-.\/:<=>?@^~]+/, Operator
end
state :variables do
rule /[A-Z]+\w*/, Name::Variable
rule /_[[:word:]]*/, Name::Variable
end
state :root do
mixin :basic
mixin :atoms
mixin :variables
mixin :operators
end
state :nested_comment do
rule /\/\*/, Comment::Multiline, :push
rule /\s*\*[^*\/]+/, Comment::Multiline
rule /\*\//, Comment::Multiline, :pop!
end
end
end
end