Files
hakorune/src/grammar/generated.rs
nyash-codex 91d7607682 refactor(mir): Phase 137-6-S2 - dev-only で canonicalizer decision を提案として受け取る
## 目的
Canonicalizer の decision を router に差し込む(既定挙動不変)

## 変更内容

### choose_pattern_kind() に parity check 統合
- dev-only 時に Canonicalizer を呼び出し
- router_choice と canonical_choice を比較
- 不一致時の動作:
  - strict mode (`HAKO_JOINIR_STRICT=1`): panic (Fail-Fast)
  - debug mode (`NYASH_JOINIR_DEV=1`): ログのみ
- 既定挙動: router_choice を維持(Canonicalizer は提案のみ)

### ログ出力
```
[choose_pattern_kind/PARITY] OK: canonical and actual agree on Pattern2Break
```

## 効果
-  Canonicalizer → Router の parity check 統合
-  SSOT 入口での一致性検証
-  既定挙動完全不変(フラグOFF時)
-  新 env 追加なし(既存の `joinir_dev_enabled()` と `strict_enabled()` を使用)

## テスト結果
-  `cargo build --release`: 成功
-  skip_whitespace: parity green
  ```
  NYASH_JOINIR_DEV=1 HAKO_JOINIR_STRICT=1 ./target/release/hakorune \
    tools/selfhost/test_pattern3_skip_whitespace.hako
  → [choose_pattern_kind/PARITY] OK
  ```
-  スモークテスト(simple_*): 5/5 PASS
-  退行なし

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 07:42:35 +09:00

51 lines
1.9 KiB
Rust

// Auto-generated from grammar/unified-grammar.toml
pub static KEYWORDS: &[(&str, &str)] = &[
("me", "ME"),
("from", "FROM"),
("loop", "LOOP"),
("box", "BOX"),
("local", "LOCAL"),
("peek", "PEEK"),
];
pub static OPERATORS_ADD_COERCION: &str = "string_priority";
pub static OPERATORS_SUB_COERCION: &str = "numeric_only";
pub static OPERATORS_MUL_COERCION: &str = "numeric_only";
pub static OPERATORS_DIV_COERCION: &str = "numeric_only";
pub static OPERATORS_ADD_RULES: &[(&str, &str, &str, &str)] = &[
("String", "String", "String", "concat"),
("String", "Integer", "String", "concat"),
("Integer", "String", "String", "concat"),
("String", "Bool", "String", "concat"),
("Bool", "String", "String", "concat"),
("String", "Other", "String", "concat"),
("Other", "String", "String", "concat"),
("Integer", "Integer", "Integer", "add_i64"),
("Float", "Float", "Float", "add_f64"),
];
pub static OPERATORS_SUB_RULES: &[(&str, &str, &str, &str)] = &[
("Integer", "Integer", "Integer", "sub_i64"),
("Float", "Float", "Float", "sub_f64"),
];
pub static OPERATORS_MUL_RULES: &[(&str, &str, &str, &str)] = &[
("Integer", "Integer", "Integer", "mul_i64"),
("Float", "Float", "Float", "mul_f64"),
];
pub static OPERATORS_DIV_RULES: &[(&str, &str, &str, &str)] = &[
("Integer", "Integer", "Integer", "div_i64"),
("Float", "Float", "Float", "div_f64"),
];
pub fn lookup_keyword(word: &str) -> Option<&'static str> {
for (k, t) in KEYWORDS {
if *k == word {
return Some(*t);
}
}
None
}
pub static SYNTAX_ALLOWED_STATEMENTS: &[&str] = &[
"box", "global", "function", "static", "if", "loop", "break", "return", "print", "nowait",
"include", "local", "outbox", "try", "throw", "using", "from",
];
pub static SYNTAX_ALLOWED_BINOPS: &[&str] = &["add", "sub", "mul", "div", "and", "or", "eq", "ne"];