🚀 feat: Multiple improvements for Nyash parser and LLVM backend
Parser improvements: - Added expression statement fallback in parse_statement() for flexible syntax - Fixed ternary operator to use PeekExpr instead of If AST (better lowering) - Added peek_token() check to avoid ?/?: operator conflicts LLVM Python improvements: - Added optional ESC_JSON_FIX environment flag for string concatenation - Improved PHI generation with better default handling - Enhanced substring tracking for esc_json pattern Documentation updates: - Updated language guide with peek expression examples - Added box theory diagrams to Phase 15 planning - Clarified peek vs when syntax differences These changes enable cleaner parser implementation for self-hosting, especially for handling digit conversion with peek expressions instead of 19-line if-else chains. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -27,8 +27,27 @@ impl super::MirBuilder {
|
||||
// Arithmetic operations
|
||||
BinaryOpType::Arithmetic(op) => {
|
||||
self.emit_instruction(MirInstruction::BinOp { dst, op, lhs, rhs })?;
|
||||
// Arithmetic results are integers for now (Core-1)
|
||||
self.value_types.insert(dst, MirType::Integer);
|
||||
// '+' は文字列連結の可能性がある。オペランドが String/StringBox なら結果を String と注釈。
|
||||
if matches!(op, crate::mir::BinaryOp::Add) {
|
||||
let lhs_is_str = match self.value_types.get(&lhs) {
|
||||
Some(MirType::String) => true,
|
||||
Some(MirType::Box(bt)) if bt == "StringBox" => true,
|
||||
_ => false,
|
||||
};
|
||||
let rhs_is_str = match self.value_types.get(&rhs) {
|
||||
Some(MirType::String) => true,
|
||||
Some(MirType::Box(bt)) if bt == "StringBox" => true,
|
||||
_ => false,
|
||||
};
|
||||
if lhs_is_str || rhs_is_str {
|
||||
self.value_types.insert(dst, MirType::String);
|
||||
} else {
|
||||
self.value_types.insert(dst, MirType::Integer);
|
||||
}
|
||||
} else {
|
||||
// その他の算術は整数
|
||||
self.value_types.insert(dst, MirType::Integer);
|
||||
}
|
||||
}
|
||||
// Comparison operations
|
||||
BinaryOpType::Comparison(op) => {
|
||||
|
||||
Reference in New Issue
Block a user