iup-stack/iup/etc/lexlua/caml.lua

63 lines
2.5 KiB
Lua
Raw Permalink Normal View History

2023-02-20 16:44:45 +00:00
-- Copyright 2006-2019 Mitchell mitchell.att.foicica.com. See License.txt.
-- OCaml 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('caml')
-- Whitespace.
lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1))
-- Keywords.
lex:add_rule('keyword', token(lexer.KEYWORD, word_match[[
and as asr begin class closed constraint do done downto else end exception
external failwith false flush for fun function functor if in include incr
inherit land let load los lsl lsr lxor match method mod module mutable new not
of open option or parser private raise rec ref regexp sig stderr stdin stdout
struct then to true try type val virtual when while with
]]))
-- Types.
lex:add_rule('type', token(lexer.TYPE, word_match[[
bool char float int string unit
]]))
-- Functions.
lex:add_rule('function', token(lexer.FUNCTION, word_match[[
abs abs_float acos asin atan atan2 at_exit bool_of_string ceil char_of_int
classify_float close_in close_in_noerr close_out close_out_noerr compare cos
cosh decr epsilon_float exit exp failwith float float_of_int float_of_string
floor flush flush_all format_of_string frexp fst ignore in_channel_length incr
infinity input input_binary_int input_byte input_char input_line input_value
int_of_char int_of_float int_of_string invalid_arg ldexp log log10 max
max_float max_int min min_float min_int mod modf mod_float nan open_in
open_in_bin open_in_gen open_out open_out_bin open_out_gen out_channel_length
output output_binary_int output_byte output_char output_string output_value
pos_in pos_out pred prerr_char prerr_endline prerr_float prerr_int
prerr_newline prerr_string print_char print_endline print_float print_int
print_newline print_string raise read_float read_int read_line really_input
seek_in seek_out set_binary_mode_in set_binary_mode_out sin sinh snd sqrt
stderr stdin stdout string_of_bool string_of_float string_of_format
string_of_int succ tan tanh truncate
]]))
-- Identifiers.
lex:add_rule('identifier', token(lexer.IDENTIFIER, lexer.word))
-- Strings.
lex:add_rule('string', token(lexer.STRING, lexer.delimited_range("'", true) +
lexer.delimited_range('"', true)))
-- Comments.
lex:add_rule('comment', token(lexer.COMMENT, lexer.nested_pair('(*', '*)')))
-- Numbers.
lex:add_rule('number', token(lexer.NUMBER, lexer.float + lexer.integer))
-- Operators.
lex:add_rule('operator', token(lexer.OPERATOR, S('=<>+-*/.,:;~!#%^&|?[](){}')))
return lex