From 46ef31467b6cc7bc3a2fcb491db98e7402e553ad Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 20 Dec 2025 03:59:32 +0000 Subject: [PATCH 1/3] Initial plan From b8a57913791dd90a639f0191e44476edef651aa5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 20 Dec 2025 04:05:02 +0000 Subject: [PATCH 2/3] Add ->* operator to BNF grammar with tests Co-authored-by: hzhangxyz <11623447+hzhangxyz@users.noreply.github.com> --- bnf/Dsp.g4 | 1 + bnf/tests/test_parse_unparse.mjs | 16 ++++++++++++++++ bnf/tests/test_parse_unparse.py | 16 ++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/bnf/Dsp.g4 b/bnf/Dsp.g4 index dac731c..7508731 100644 --- a/bnf/Dsp.g4 +++ b/bnf/Dsp.g4 @@ -18,6 +18,7 @@ term | term '(' (term (',' term)*)? ')' # function | ('~' | '!' | '-' | '+' | '&' | '*') term # unary | term '.*' term # binary + | term '->*' term # binary | term ('*' | '/' | '%') term # binary | term ('+' | '-') term # binary | term ('<<' | '>>') term # binary diff --git a/bnf/tests/test_parse_unparse.mjs b/bnf/tests/test_parse_unparse.mjs index 063be3f..8f2bb60 100644 --- a/bnf/tests/test_parse_unparse.mjs +++ b/bnf/tests/test_parse_unparse.mjs @@ -40,6 +40,14 @@ test("parse_binary_operator", () => { expect(ds_output).toBe(expected); }); +test("parse_pointer_to_member_operator", () => { + // Test parsing pointer-to-member operator (->*) + const dsp_input = "(a ->* b) => c"; + const ds_output = parse(dsp_input); + const expected = "(binary ->* a b)\n----------------\nc\n"; + expect(ds_output).toBe(expected); +}); + test("parse_unary_operator", () => { // Test parsing unary operators const dsp_input = "~ a => b"; @@ -104,6 +112,14 @@ test("unparse_binary_operator", () => { expect(dsp_output).toBe(expected); }); +test("unparse_pointer_to_member_operator", () => { + // Test unparsing pointer-to-member operator (->*) + const ds_input = "(binary ->* a b)\n----\nc\n"; + const dsp_output = unparse(ds_input); + const expected = "(a ->* b) => c"; + expect(dsp_output).toBe(expected); +}); + test("unparse_unary_operator", () => { // Test unparsing unary operators const ds_input = "(unary ~ a)\n----\nb\n"; diff --git a/bnf/tests/test_parse_unparse.py b/bnf/tests/test_parse_unparse.py index a2374b3..af2ca29 100644 --- a/bnf/tests/test_parse_unparse.py +++ b/bnf/tests/test_parse_unparse.py @@ -42,6 +42,14 @@ def test_parse_binary_operator() -> None: assert ds_output == expected +def test_parse_pointer_to_member_operator() -> None: + """Test parsing pointer-to-member operator (->*)""" + dsp_input = "(a ->* b) => c" + ds_output = parse(dsp_input) + expected = "(binary ->* a b)\n----------------\nc\n" + assert ds_output == expected + + def test_parse_unary_operator() -> None: """Test parsing unary operators""" dsp_input = "~ a => b" @@ -106,6 +114,14 @@ def test_unparse_binary_operator() -> None: assert dsp_output == expected +def test_unparse_pointer_to_member_operator() -> None: + """Test unparsing pointer-to-member operator (->*)""" + ds_input = "(binary ->* a b)\n----\nc\n" + dsp_output = unparse(ds_input) + expected = "(a ->* b) => c" + assert dsp_output == expected + + def test_unparse_unary_operator() -> None: """Test unparsing unary operators""" ds_input = "(unary ~ a)\n----\nb\n" From 7488f90be6692f0e6845304b03bcb362b3bb83cf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 20 Dec 2025 04:15:54 +0000 Subject: [PATCH 3/3] Fix: Put ->* and .* operators on same line, remove test additions Co-authored-by: hzhangxyz <11623447+hzhangxyz@users.noreply.github.com> --- bnf/Dsp.g4 | 3 +-- bnf/tests/test_parse_unparse.mjs | 16 ---------------- bnf/tests/test_parse_unparse.py | 16 ---------------- 3 files changed, 1 insertion(+), 34 deletions(-) diff --git a/bnf/Dsp.g4 b/bnf/Dsp.g4 index 7508731..3639dc1 100644 --- a/bnf/Dsp.g4 +++ b/bnf/Dsp.g4 @@ -17,8 +17,7 @@ term | term '[' term (',' term)* ']' # subscript | term '(' (term (',' term)*)? ')' # function | ('~' | '!' | '-' | '+' | '&' | '*') term # unary - | term '.*' term # binary - | term '->*' term # binary + | term ('.*' | '->*') term # binary | term ('*' | '/' | '%') term # binary | term ('+' | '-') term # binary | term ('<<' | '>>') term # binary diff --git a/bnf/tests/test_parse_unparse.mjs b/bnf/tests/test_parse_unparse.mjs index 8f2bb60..063be3f 100644 --- a/bnf/tests/test_parse_unparse.mjs +++ b/bnf/tests/test_parse_unparse.mjs @@ -40,14 +40,6 @@ test("parse_binary_operator", () => { expect(ds_output).toBe(expected); }); -test("parse_pointer_to_member_operator", () => { - // Test parsing pointer-to-member operator (->*) - const dsp_input = "(a ->* b) => c"; - const ds_output = parse(dsp_input); - const expected = "(binary ->* a b)\n----------------\nc\n"; - expect(ds_output).toBe(expected); -}); - test("parse_unary_operator", () => { // Test parsing unary operators const dsp_input = "~ a => b"; @@ -112,14 +104,6 @@ test("unparse_binary_operator", () => { expect(dsp_output).toBe(expected); }); -test("unparse_pointer_to_member_operator", () => { - // Test unparsing pointer-to-member operator (->*) - const ds_input = "(binary ->* a b)\n----\nc\n"; - const dsp_output = unparse(ds_input); - const expected = "(a ->* b) => c"; - expect(dsp_output).toBe(expected); -}); - test("unparse_unary_operator", () => { // Test unparsing unary operators const ds_input = "(unary ~ a)\n----\nb\n"; diff --git a/bnf/tests/test_parse_unparse.py b/bnf/tests/test_parse_unparse.py index af2ca29..a2374b3 100644 --- a/bnf/tests/test_parse_unparse.py +++ b/bnf/tests/test_parse_unparse.py @@ -42,14 +42,6 @@ def test_parse_binary_operator() -> None: assert ds_output == expected -def test_parse_pointer_to_member_operator() -> None: - """Test parsing pointer-to-member operator (->*)""" - dsp_input = "(a ->* b) => c" - ds_output = parse(dsp_input) - expected = "(binary ->* a b)\n----------------\nc\n" - assert ds_output == expected - - def test_parse_unary_operator() -> None: """Test parsing unary operators""" dsp_input = "~ a => b" @@ -114,14 +106,6 @@ def test_unparse_binary_operator() -> None: assert dsp_output == expected -def test_unparse_pointer_to_member_operator() -> None: - """Test unparsing pointer-to-member operator (->*)""" - ds_input = "(binary ->* a b)\n----\nc\n" - dsp_output = unparse(ds_input) - expected = "(a ->* b) => c" - assert dsp_output == expected - - def test_unparse_unary_operator() -> None: """Test unparsing unary operators""" ds_input = "(unary ~ a)\n----\nb\n"