| # -*- coding: utf-8 -*- # |
| |
| module Rouge |
| module Lexers |
| class Pascal < RegexLexer |
| tag 'pascal' |
| title "Pascal" |
| desc 'a procedural programming language commonly used as a teaching language.' |
| filenames '*.pas' |
| |
| mimetypes 'text/x-pascal' |
| |
| id = /@?[_a-z]\w*/i |
| |
| keywords = %w( |
| absolute abstract all and and_then array as asm assembler attribute |
| begin bindable case class const constructor delay destructor div do |
| downto else end except exit export exports external far file finalization |
| finally for forward function goto if implementation import in inc index |
| inherited initialization inline interface interrupt is label library |
| message mod module near nil not object of on only operator or or_else |
| otherwise out overload override packed pascal pow private procedure program |
| property protected public published qualified raise read record register |
| repeat resident resourcestring restricted safecall segment set shl shr |
| stdcall stored string then threadvar to try type unit until uses value var |
| view virtual while with write writeln xor |
| ) |
| |
| keywords_type = %w( |
| ansichar ansistring bool boolean byte bytebool cardinal char comp currency |
| double dword extended int64 integer iunknown longbool longint longword pansichar |
| pansistring pbool pboolean pbyte pbytearray pcardinal pchar pcomp pcurrency |
| pdate pdatetime pdouble pdword pextended phandle pint64 pinteger plongint plongword |
| pointer ppointer pshortint pshortstring psingle psmallint pstring pvariant pwidechar |
| pwidestring pword pwordarray pwordbool real real48 shortint shortstring single |
| smallint string tclass tdate tdatetime textfile thandle tobject ttime variant |
| widechar widestring word wordbool |
| ) |
| |
| state :whitespace do |
| # Spaces |
| rule /\s+/m, Text |
| # // Comments |
| rule %r((//).*$\n?), Comment::Single |
| # -- Comments |
| rule %r((--).*$\n?), Comment::Single |
| # (* Comments *) |
| rule %r(\(\*.*?\*\))m, Comment::Multiline |
| # { Comments } |
| rule %r(\{.*?\})m, Comment::Multiline |
| end |
| |
| state :root do |
| mixin :whitespace |
| |
| rule %r{((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?}, Num |
| rule %r{[~!@#\$%\^&\*\(\)\+`\-={}\[\]:;<>\?,\.\/\|\\]}, Punctuation |
| rule %r{'([^']|'')*'}, Str |
| rule /(true|false|nil)\b/i, Name::Builtin |
| rule /\b(#{keywords.join('|')})\b/i, Keyword |
| rule /\b(#{keywords_type.join('|')})\b/i, Keyword::Type |
| rule id, Name |
| end |
| end |
| end |
| end |