ILLEX: Inline Language for Logic and EXpressions¶
Overview¶
ILLEX is a lightweight scripting language for structured text processing, featuring variable substitution, inline expressions, and customizable handlers. Built on a state machine-based parser with safe evaluation and extensibility.
Key Features¶
- Secure expression parsing with controlled variable evaluation
- Inline variable assignments and references (e.g.,
@var = value
) - Customizable function handlers for advanced text transformation
- Recursive resolution of expressions with safe execution
- Loops, conditionals, logical and mathematical operators
Installation¶
pip install illex
Basic Usage¶
Variable Substitution¶
import illex
illex.parse("Hello, {name}!", {"name": "World"})
# Result: 'Hello, World!'
Variable Assignment and Reference¶
text = """
@name = John
@age = 30
Name: @name, Age: @age
"""
illex.parse(text, {})
# Result: 'Name: John, Age: 30'
Mathematical Expressions¶
text = """
@x = 10
@y = 20
Sum: @x + @y
Product: :calc(@x * @y)
"""
illex.parse(text, {})
# Result: 'Sum: 10 + 20\nProduct: 200'
Syntax Structure¶
Variables¶
- Assignment:
@variable = value
- Reference:
@variable
- List/Dictionary access:
@list[0]
,@dict["key"]
,@dict[key]
Built-in Functions¶
Functions are called with the :
prefix followed by the function name and arguments in parentheses.
Example: :function(arg1, arg2)
Built-in Functions¶
String Manipulation¶
:uppercase(text)
- Converts text to uppercase:lowercase(text)
- Converts text to lowercase:capitalize(text)
- Capitalizes the first letter of text:trim(text)
- Removes whitespace from both ends:replace(text, search, replace)
- Replaces occurrences
Math Functions¶
:calc(expression)
- Evaluates a mathematical expression:int(value)
- Converts to integer:float(value)
- Converts to floating point:abs(value)
- Absolute value (integer):fabs(value)
- Absolute value (float):floor(value)
- Rounds down:ceil(value)
- Rounds up
Date Functions¶
:date(format)
- Returns formatted date- Special formats:
today
,now
,yesterday
,tomorrow
- Supports standard date format strings (e.g.,
%d/%m/%Y
)
Lists and Dictionaries¶
:list(item1, item2, ...)
- Creates a list:split(text, delimiter)
- Splits text into a list:options(key1=value1, key2=value2, ...)
- Creates a dictionary
Conditional Functions¶
:if(condition, true_result, false_result)
- Conditional expression
Network Functions¶
:cidr(mask)
- Converts to CIDR notation:is_public(ip)
- Checks if IP is public:resolve(host)
- Resolves hostname to IP
Security Functions¶
:hash(text, type)
- Generates hash (md5, sha1, sha256, sha512):encrypt(text, key, type)
- Encrypts text:decrypt(text, key, type)
- Decrypts text:gen_password(length, lower, upper, with_digits, with_punctuation)
- Generates password
Utilities¶
:repeat(text, times)
- Repeats text N times:hostname(value, separator, is_upper)
- Formats as hostname:rand(start, end, leading)
- Generates random number
Command Line Usage¶
# Process .illex file
illex run file.illex
# Process with variables (key=value format)
illex run file.illex --vars name=John age=30
# Process with variables from JSON/YAML file
illex run file.illex --vars config.json
# Save result to file
illex run file.illex -o # Saves to file.illex.out
Extensibility¶
Creating New Handlers¶
from illex.decorators.handler import handler
@handler("my_function")
def my_function(text):
return text.upper()
Creating Math Functions¶
from illex.decorators.handler import handler
from illex.decorators.math import math_function
@handler("square")
@math_function
def square(value):
return value ** 2
Advanced Examples¶
Text Processing with Variables¶
@name = "Jane Smith"
@email = "jane@example.com"
@age = 28
User Profile:
Name: @name
Email: @email
Age: @age
Adult: :if(@age >= 18, "Yes", "No")
List Operations¶
@fruits = :list("apple", "banana", "orange")
@favorite_fruit = @fruits[1]
Available fruits:
@fruits[0]
@fruits[1]
@fruits[2]
My favorite fruit is @favorite_fruit.
Dynamic Content Generation¶
@server = "prod"
@environment = :if(@server == "prod", "Production", "Development")
@current_date = :date(today)
Environment Report - @current_date
Environment: @environment
Server: :uppercase(@server)
Status: :if(@environment == "Production", "CRITICAL", "Normal")
Network Processing¶
@domain = "example.com"
@ip = :resolve(@domain)
@hostname = :hostname(@domain)
Network Information:
Domain: @domain
IP: @ip
Hostname: @hostname
Public IP: :if(:is_public(@ip), "Yes", "No")
Security¶
ILLEX implements secure expression evaluation:
- Uses
safe_eval
to prevent malicious code execution - Blocked words list (
__class__
,__bases__
,__subclasses__
,__globals__
) - Explicitly controlled allowed AST nodes
- Controlled allowed binary, unary, and comparison operators
- Safe globals limited to basic functions like
list
,dict
,str
, etc.
Best Practices¶
- Use comments with
\\
or#
to document your code - Prefer specific handlers (
:calc
,:int
) for operations rather than complex expressions - Avoid excessive function nesting
- Use variables to store intermediate results
- Escape commas in function arguments with
\,
when necessary
Limitations¶
- No support for custom function definitions in ILLEX code itself
- Expression evaluation is limited for security
- No full flow control (only simple conditional structures)
License¶
ILLEX is licensed under GNU General Public License v3.0 (GPL-3.0).
Copyright (C) 2023-2025 Gustavo Zeloni
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
Full license text: https://github.com/gzeloni/illex/blob/main/LICENSE