Skip to content

Conversation

@LunaStev
Copy link
Member

Summary

This PR adds support for bitwise operations (Shift, XOR, NOT) and unary operators (Logical NOT, Bitwise NOT). It also refactors the expression parsing logic to ensure proper operator precedence, completing a robust set of industry-standard operators for Wave.

Key Changes

1. Lexer & Syntax Update

  • C-style Shift Operators: Changed the shift keywords from rol/ror to standard << (Shift Left) and >> (Shift Right) syntax.
  • Internal Mapping: Maintained TokenType::Rol and TokenType::Ror internally for consistency.

2. AST Enhancements

  • Added new operator variants to Expression and Operator enums:
    • Binary: <<, >>, ^
    • Unary: ! (Logical NOT), ~ (Bitwise NOT)
  • Introduced Expression::Unary to represent prefix operations.

3. Parser Refactoring (Precedence Hierarchy)

  • Refined the expression parsing tree to handle complex operations with correct precedence:
    • Hierarchy: Logical > Bitwise (|, ^) > Shift (<<, >>) > Relational (<, >, etc.).
  • Added parse_bitwise_expression and parse_shift_expression methods.

4. LLVM Code Generation

  • Implemented IR generation for new operations:
    • build_left_shift and build_right_shift for bitwise shifts.
    • build_not for bitwise NOT (~).
    • build_xor with const_int(1) for logical NOT (!).

5. Comprehensive Testing (test70.wave)

  • Added a full-scale operator test suite covering:
    • Arithmetic and Compound assignment.
    • Comparison and Logical operations.
    • Bitwise manipulation and Shift results.
    • Complex grouping and precedence validation.

Example Usage

var x: i32 = 10;
var y: i32 = x << 2;     // result: 40
var z: i32 = ~x;         // result: -11
var w: bool = !(x > 5);  // result: false

Add support for bitwise operations (shift, XOR, NOT) and unary operators
(logical NOT, bitwise NOT) with proper operator precedence.

Changes:
- Update lexer to use C-style shift operators:
  - Change "rol" keyword to "<<" (shift left)
  - Change "ror" keyword to ">>" (shift right)
  - Maintain TokenType::Rol and TokenType::Ror internally
- Add new operators to AST:
  - ShiftLeft (<<), ShiftRight (>>)
  - BitwiseXor (^), BitwiseNot (~)
  - LogicalNot (!)
- Implement unary expression support:
  - Add Expression::Unary variant with operator and inner expression
  - Parse unary prefix operators (!, ~) in parse_expression
  - Generate LLVM IR for unary operations
- Refactor expression parsing precedence hierarchy:
  - parse_logical_expression now calls parse_bitwise_expression
  - Add parse_bitwise_expression for |, ^ operators
  - Add parse_shift_expression for <<, >> operators
  - Maintain proper precedence: logical > bitwise > shift > relational
- Implement LLVM code generation for new operators:
  - build_left_shift / build_right_shift for << and >>
  - build_not for bitwise NOT (~)
  - build_xor with const_int(1) for logical NOT (!)
- Add comprehensive operator test (test70.wave):
  - Arithmetic operators (+, -, *, /, %)
  - Compound assignment (+=, -=, *=, /=)
  - Comparison operators (==, !=, <, <=, >, >=)
  - Logical operators (&&, ||, !)
  - Bitwise operators (|, ^, ~)
  - Shift operators (<<, >>)
  - Operator precedence and grouping

Example usage:
  var x: i32 = 10;
  var y: i32 = x << 2;     // 40
  var z: i32 = ~x;         // -11 (two's complement)
  var w: bool = !(x > 5);  // false

This completes Wave's operator set with industry-standard bitwise
manipulation and unary operations, matching C/C++ operator syntax.

Signed-off-by: LunaStev <luna@lunastev.org>
@LunaStev LunaStev self-assigned this Dec 17, 2025
@LunaStev LunaStev merged commit 4208021 into wavefnd:master Dec 17, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant