logo

oasis-root

Compiled tree of Oasis Linux based on own branch at <https://hacktivis.me/git/oasis/> git clone https://anongit.hacktivis.me/git/oasis-root.git

logtalk.lua (3564B)


  1. -- Copyright © 2017-2024 Michael T. Richter <ttmrichter@gmail.com>. See LICENSE.
  2. -- Logtalk LPeg lexer.
  3. local lexer = require('lexer')
  4. local token, word_match = lexer.token, lexer.word_match
  5. local P, S = lpeg.P, lpeg.S
  6. local lex = lexer.new('logtalk', {inherit = lexer.load('prolog')})
  7. -- add logtalk keywords to prolog ones
  8. local directives = {
  9. 'set_logtalk_flag', 'object', 'info', 'built_in', 'threaded', 'uses', 'alias', 'use_module',
  10. 'coinductive', 'export', 'reexport', 'public', 'metapredicate', 'mode', 'meta_non_terminal',
  11. 'protected', 'synchronized', 'private', 'module', 'if', 'elif', 'else', 'endif', 'category',
  12. 'protocol', 'end_object', 'end_category', 'end_protocol', 'meta_predicate'
  13. }
  14. local indent = token(lexer.WHITESPACE, lexer.starts_line(S(' \t')^1))^-1
  15. lex:modify_rule('directive',
  16. (indent * token(lexer.OPERATOR, ':-') * token(lexer.WHITESPACE, S(' \t')^0) *
  17. token(lexer.PREPROCESSOR, word_match(directives))
  18. ) + lex:get_rule('directive'))
  19. -- Whitespace.
  20. lex:modify_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1))
  21. local zero_arity_keywords = {
  22. -- extracted from test document in logtalk distribution
  23. 'comment', 'argnames', 'arguments', 'author', 'version', 'date', 'parameters', 'parnames',
  24. 'copyright', 'license', 'remarks', 'see_also', 'as', 'logtalk_make', 'instantiation_error',
  25. 'system_error'
  26. }
  27. local one_plus_arity_keywords = {
  28. -- extracted from test document in logtalk distribution
  29. 'implements', 'imports', 'extends', 'instantiates', 'specializes', 'number_chars', 'number_code',
  30. 'current_category', 'current_object', 'current_protocol', 'create_category', 'create_object',
  31. 'create_protocol', 'abolish_category', 'abolish_object', 'abolish_protocol', 'category_property',
  32. 'object_property', 'protocol_property', 'extends_category', 'extends_object', 'extends_protocol',
  33. 'implements_protocol', 'imports_category', 'instantiates_class', 'specializes_class',
  34. 'complements_object', 'conforms_to_protocol', 'abolish_events', 'current_event', 'define_events',
  35. 'threaded', 'threaded_call', 'threaded_call', 'threaded_once', 'threaded_ignore', 'threaded_exit',
  36. 'threaded_peek', 'threaded_cancel', 'threaded_wait', 'threaded_notify', 'threaded_engine',
  37. 'threaded_engine_create', 'threaded_engine_destroy', 'threaded_engine_self',
  38. 'threaded_engine_next', 'threaded_engine_next_reified', 'threaded_engine_yield',
  39. 'threaded_engine_post', 'threaded_engine_fetch', 'logtalk_compile', 'logtalk_load',
  40. 'logtalk_library_path', 'logtalk_load_context', 'logtalk_make_target_action',
  41. 'current_logtalk_flag', 'set_logtalk_flag', 'create_logtalk_flag', 'context', 'parameter', 'self',
  42. 'sender', 'this', 'type_error', 'domain_error', 'existence_error', 'permission_error',
  43. 'representation_error', 'evaluation_error', 'resource_error', 'syntax_error', 'bagof', 'findall',
  44. 'forall', 'setof', 'before', 'after', 'forward', 'phrase', 'expand_term', 'expand_goal',
  45. 'term_expansion', 'goal_expansion', 'numbervars', 'put_code', 'put_byte', 'current_op', 'op',
  46. 'ignore', 'repeat', 'number_codes', 'current_prolog_flag', 'set_prolog_flag', 'keysort', 'sort'
  47. }
  48. local keyword = word_match(zero_arity_keywords) + (word_match(one_plus_arity_keywords) * #P('('))
  49. lex:modify_rule('keyword', token(lexer.KEYWORD, keyword) + lex:get_rule('keyword'))
  50. local operators = {
  51. -- extracted from test document in logtalk distribution
  52. 'as'
  53. }
  54. lex:modify_rule('operator', token(lexer.OPERATOR, word_match(operators)) + lex:get_rule('operator'))
  55. lexer.property['scintillua.comment'] = '%'
  56. return lex