#!/usr/bin/awk -f
# Set debug mode
DEBUG = 1 # Change to 0 to disable debug output
# Environment to store variable bindings
BEGIN {
print "Welcome to the AWK Scheme Interpreter!"
print "Type your Scheme expressions below (type 'exit' to quit):"
while (1) {
printf "> "
if (getline input <= 0) {
print "Error reading input. Exiting."
break
}
if (input == "exit") {
print "Exiting the interpreter."
exit
}
if (input == "") {
print "Empty input received, continuing..."
continue
}
print "Input received: " input # Echo the input
ast = parse(input) # Parse the input
# Print the entire AST for debugging
for (i = 1; i <= length(ast); i++) {
print "AST[" i "] = " ast[i]
}
# Evaluate the AST
if (length(ast) > 0) {
result = eval(ast) # Evaluate the AST
print "Result: " result # Print the result
} else {
print "Parsed AST is empty."
}
}
}
# Function to parse input into an AST
function parse(input) {
# Remove outer whitespace
gsub(/^\s+|\s+$/, "", input)
# Check if input is empty after trimming
if (input == "") {
print "Input is empty after trimming"
return ""
}
# Debugging: Print input before processing
print "Debug: Raw input for parsing: " input
# Remove parentheses at start and end
if (substr(input, 1, 1) == "(") {
input = substr(input, 2)
}
if (substr(input, length(input), 1) == ")") {
input = substr(input, 1, length(input) - 1)
}
# Debugging: Print input after removing outer parentheses
print "Debug: Input after removing outer parentheses: " input
# Split the input into tokens
gsub(/\(/, " ( ", input)
gsub(/\)/, " ) ", input)
gsub(/\s+/, " ", input) # normalize whitespace
gsub(/^\s+|\s+$/, "", input) # trim
# Debugging: Print input after tokenization
print "Debug: Input after tokenization: " input
n = split(input, ast, " ")
# Debugging: Print the number of tokens
print "Debug: Number of tokens: " n
return ast
}
# Function to evaluate the AST
function eval(ast, i, result) {
# Debugging: Print the current AST being evaluated
print "Debug: Evaluating AST: " ast[1] " " ast[2] " " ast[3]
# Handle numbers directly
if (ast[1] ~ /^[+-]?[0-9]+$/) {
print "Debug: Returning number: " ast[1]
return ast[1] + 0 # Convert string to number
}
# Handle addition
if (ast[1] == "+") {
result = 0
for (i = 2; i <= length(ast); i++) {
print "Debug: Adding operand: " ast[i]
result += eval(ast[i]) # Recursively evaluate operands
}
return result
}
# Handle subtraction
if (ast[1] == "-") {
result = eval(ast[2]) # Start with the first operand
for (i = 3; i <= length(ast); i++) {
print "Debug: Subtracting operand: " ast[i]
result -= eval(ast[i]) # Subtract subsequent operands
}
return result
}
# Handle multiplication
if (ast[1] == "*") {
result = 1
for (i = 2; i <= length(ast); i++) {
print "Debug: Multiplying operand: " ast[i]
result *= eval(ast[i]) # Multiply operands
}
return result
}
# Handle division
if (ast[1] == "/") {
result = eval(ast[2]) # Start with the first operand
for (i = 3; i <= length(ast); i++) {
print "Debug: Dividing by operand: " ast[i]
result /= eval(ast[i]) # Divide by subsequent operands
}
return result
}
# If we reach here, the operation is not recognized
return "Error: Unknown operation " ast[1]
}