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

58 lines
1.9 KiB
Lua
Executable File

-- Copyright 2006-2019 Mitchell mitchell.att.foicica.com. See License.txt.
-- Ada 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('ada')
-- Whitespace.
lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1))
-- Keywords.
lex:add_rule('keyword', token(lexer.KEYWORD, word_match[[
abort abs accept all and begin body case declare delay do else elsif end entry
exception exit for generic goto if in is loop mod new not null or others out
protected raise record rem renames requeue reverse select separate subtype
task terminate then type until when while xor
-- Preprocessor.
package pragma use with
-- Function.
function procedure return
-- Storage class.
abstract access aliased array at constant delta digits interface limited of
private range tagged synchronized
-- Boolean.
true false
]]))
-- Types.
lex:add_rule('type', token(lexer.TYPE, word_match[[
boolean character count duration float integer long_float long_integer
priority short_float short_integer string
]]))
-- Identifiers.
lex:add_rule('identifier', token(lexer.IDENTIFIER, lexer.word))
-- Strings.
lex:add_rule('string', token(lexer.STRING,
lexer.delimited_range('"', true, true)))
-- Comments.
lex:add_rule('comment', token(lexer.COMMENT, '--' * lexer.nonnewline^0))
-- Numbers.
local hex_num = 'O' * S('xX') * (lexer.xdigit + '_')^1
local integer = lexer.digit^1 * ('_' * lexer.digit^1)^0
local float = integer^1 * ('.' * integer^0)^-1 * S('eE') * S('+-')^-1 * integer
lex:add_rule('number', token(lexer.NUMBER, hex_num +
S('+-')^-1 * (float + integer) *
S('LlUuFf')^-3))
-- Operators.
lex:add_rule('operator', token(lexer.OPERATOR, S(':;=<>&+-*/.()')))
return lex