diff options
Diffstat (limited to 'lua/lexers/logtalk.lua')
| -rw-r--r-- | lua/lexers/logtalk.lua | 98 |
1 files changed, 54 insertions, 44 deletions
diff --git a/lua/lexers/logtalk.lua b/lua/lexers/logtalk.lua index 3986859..e33e80a 100644 --- a/lua/lexers/logtalk.lua +++ b/lua/lexers/logtalk.lua @@ -1,52 +1,62 @@ --- Copyright © 2017 Michael T. Richter <ttmrichter@gmail.com>. See LICENSE. +-- Copyright © 2017-2022 Michael T. Richter <ttmrichter@gmail.com>. See LICENSE. -- Logtalk LPeg lexer. -local l = require 'lexer' -local token, word_match = l.token, l.word_match -local B, P, R, S, V = lpeg.B, lpeg.P, lpeg.R, lpeg.S, lpeg.V +local lexer = require('lexer') +local token, word_match = lexer.token, lexer.word_match +local P, S = lpeg.P, lpeg.S -local M = { _NAME = 'logtalk' } +local lex = lexer.new('logtalk', {inherit = lexer.load('prolog')}) -local keyword = token(l.KEYWORD, word_match{ - -- Logtalk "keywords" generated from Vim syntax highlighting file with Prolog - -- keywords stripped since we're building up on the Prolog lexer. - 'abolish_category', 'abolish_events', 'abolish_object', 'abolish_protocol', - 'after', 'alias', 'as', 'before', 'built_in', 'calls', 'category', - 'category_property', 'coinductive', 'complements', 'complements_object', - 'conforms_to_protocol', 'create', 'create_category', 'create_object', - 'create_protocol', 'create_logtalk_flag', 'current', 'current_category', - 'current_event', 'current_logtalk_flag', 'current_object', 'current_protocol', - 'define_events', 'encoding', 'end_category', 'end_class', 'end_object', - 'end_protocol', 'extends', 'extends_category', 'extends_object', - 'extends_protocol', 'forward', 'implements', 'implements_protocol', 'imports', - 'imports_category', 'include', 'info', 'instantiates', 'instantiates_class', - 'is', 'logtalk_compile', 'logtalk_library_path', 'logtalk_load', - 'logtalk_load_context', 'logtalk_make', 'meta_non_terminal', 'mode', 'object', - 'object_property', 'parameter', 'private', 'protected', 'protocol_property', - 'self', 'sender', 'set_logtalk_flag', 'specializes', 'specializes_class', - 'synchronized', 'this', 'threaded', 'threaded_call', 'threaded_engine', - 'threaded_engine_create', 'threaded_engine_destroy', 'threaded_engine_fetch', - 'threaded_engine_next', 'threaded_engine_next_reified', - 'threaded_engine_post', 'threaded_engine_self', 'threaded_engine_yield', - 'threaded_exit', 'threaded_ignore', 'threaded_notify', 'threaded_once', - 'threaded_peek', 'threaded_wait', 'uses', +-- add logtalk keywords to prolog ones +local directives = { + 'set_logtalk_flag', 'object', 'info', 'built_in', 'threaded', 'uses', 'alias', 'use_module', + 'coinductive', 'export', 'reexport', 'public', 'metapredicate', 'mode', 'meta_non_terminal', + 'protected', 'synchronized', 'private', 'module', 'if', 'elif', 'else', 'endif', 'category', + 'protocol', 'end_object', 'end_category', 'end_protocol', 'meta_predicate' +} +local indent = token(lexer.WHITESPACE, lexer.starts_line(S(' \t')^1))^-1 +lex:modify_rule('directive', + (indent * token(lexer.OPERATOR, ':-') * token(lexer.WHITESPACE, S(' \t')^0) * + token(lexer.PREPROCESSOR, word_match(directives)) +) + lex:get_rule('directive')) - -- info/1 and info/2 predicates have their own keywords, manually extracted - -- from documentation - 'comment', 'argnames', 'arguments', 'author', 'version', 'date', 'parameters', - 'parnames', 'copyright', 'license', 'remarks', 'see_also', -}) +-- Whitespace. +lex:modify_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1)) --- Extend prolog lexer to include logtalk extensions. -local prolog = l.load('prolog') -local _rules = prolog._rules -for i = 1, #_rules do - if _rules[i][1] == 'keyword' then - table.insert(_rules, i, {'logtalk_keyword', keyword}) - end -end +local zero_arity_keywords = { + -- extracted from test document in logtalk distribution + 'comment', 'argnames', 'arguments', 'author', 'version', 'date', 'parameters', 'parnames', + 'copyright', 'license', 'remarks', 'see_also', 'as', 'logtalk_make', 'instantiation_error', + 'system_error' +} +local one_plus_arity_keywords = { + -- extracted from test document in logtalk distribution + 'implements', 'imports', 'extends', 'instantiates', 'specializes', 'number_chars', 'number_code', + 'current_category', 'current_object', 'current_protocol', 'create_category', 'create_object', + 'create_protocol', 'abolish_category', 'abolish_object', 'abolish_protocol', 'category_property', + 'object_property', 'protocol_property', 'extends_category', 'extends_object', 'extends_protocol', + 'implements_protocol', 'imports_category', 'instantiates_class', 'specializes_class', + 'complements_object', 'conforms_to_protocol', 'abolish_events', 'current_event', 'define_events', + 'threaded', 'threaded_call', 'threaded_call', 'threaded_once', 'threaded_ignore', 'threaded_exit', + 'threaded_peek', 'threaded_cancel', 'threaded_wait', 'threaded_notify', 'threaded_engine', + 'threaded_engine_create', 'threaded_engine_destroy', 'threaded_engine_self', + 'threaded_engine_next', 'threaded_engine_next_reified', 'threaded_engine_yield', + 'threaded_engine_post', 'threaded_engine_fetch', 'logtalk_compile', 'logtalk_load', + 'logtalk_library_path', 'logtalk_load_context', 'logtalk_make_target_action', + 'current_logtalk_flag', 'set_logtalk_flag', 'create_logtalk_flag', 'context', 'parameter', 'self', + 'sender', 'this', 'type_error', 'domain_error', 'existence_error', 'permission_error', + 'representation_error', 'evaluation_error', 'resource_error', 'syntax_error', 'bagof', 'findall', + 'forall', 'setof', 'before', 'after', 'forward', 'phrase', 'expand_term', 'expand_goal', + 'term_expansion', 'goal_expansion', 'numbervars', 'put_code', 'put_byte', 'current_op', 'op', + 'ignore', 'repeat', 'number_codes', 'current_prolog_flag', 'set_prolog_flag', 'keysort', 'sort' +} +local keyword = word_match(zero_arity_keywords) + (word_match(one_plus_arity_keywords) * #P('(')) +lex:modify_rule('keyword', token(lexer.KEYWORD, keyword) + lex:get_rule('keyword')) -M._rules = _rules -M._foldsymbols = prolog._foldsymbols +local operators = { + -- extracted from test document in logtalk distribution + 'as' +} +lex:modify_rule('operator', token(lexer.OPERATOR, word_match(operators)) + lex:get_rule('operator')) -return M +return lex |
