71 lines
3.1 KiB
Lua
71 lines
3.1 KiB
Lua
|
-- Copyright © 2017-2019 Michael T. Richter <ttmrichter@gmail.com>. See License.txt.
|
||
|
-- Logtalk LPeg lexer.
|
||
|
|
||
|
local lexer = require('lexer')
|
||
|
local token, word_match = lexer.token, lexer.word_match
|
||
|
local P, R, S = lpeg.P, lpeg.R, lpeg.S
|
||
|
|
||
|
local lex = lexer.new('logtalk', {inherit = lexer.load('prolog')})
|
||
|
|
||
|
-- 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
|
||
|
]]
|
||
|
lex:modify_rule('directive',
|
||
|
(
|
||
|
token(lexer.WHITESPACE, lexer.starts_line(S(' \t'))^0) *
|
||
|
token(lexer.OPERATOR, P':-') *
|
||
|
token(lexer.WHITESPACE, (S(' \t')^0)) *
|
||
|
token(lexer.PREPROCESSOR, P(word_match(directives)))
|
||
|
) +
|
||
|
lex:get_rule('directive')
|
||
|
)
|
||
|
|
||
|
-- Whitespace.
|
||
|
lex:modify_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1))
|
||
|
|
||
|
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
|
||
|
]]
|
||
|
lex:modify_rule('keyword', token(lexer.KEYWORD,
|
||
|
word_match(zero_arity_keywords) +
|
||
|
(word_match(one_plus_arity_keywords) * #(P'('))) +
|
||
|
lex:get_rule('keyword')
|
||
|
)
|
||
|
|
||
|
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 lex
|