Skip to content

Commit 41d488f

Browse files
committed
Regenerated parser state tables to apply modulo precedence changes.
Also added a few test cases to verify it works.
1 parent bf8c8f2 commit 41d488f

File tree

3 files changed

+88
-10
lines changed

3 files changed

+88
-10
lines changed

projectm-eval/Compiler.c

+10-10
Original file line numberDiff line numberDiff line change
@@ -518,11 +518,11 @@ static const yytype_int8 yytranslate[] =
518518
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
519519
static const yytype_uint8 yyrline[] =
520520
{
521-
0, 78, 78, 79, 89, 93, 94, 98, 102, 103,
522-
104, 108, 109, 115, 116, 119, 122, 123, 124, 131,
523-
132, 133, 134, 135, 136, 137, 138, 141, 142, 143,
524-
144, 145, 146, 149, 150, 153, 156, 159, 162, 163,
525-
164, 165, 166, 167, 168, 169, 172, 173, 174, 177
521+
0, 77, 77, 78, 88, 92, 93, 97, 101, 102,
522+
103, 107, 108, 114, 115, 118, 121, 122, 123, 130,
523+
131, 132, 133, 134, 135, 136, 137, 140, 141, 142,
524+
143, 144, 145, 148, 149, 152, 155, 158, 161, 162,
525+
163, 164, 165, 166, 167, 168, 171, 172, 173, 176
526526
};
527527
#endif
528528

@@ -575,7 +575,7 @@ static const yytype_int16 yypact[] =
575575
92, 92, 92, 92, 92, 92, 92, 92, 74, -35,
576576
136, 25, 21, -35, 42, -35, 243, 278, 278, 311,
577577
340, 340, 311, 311, 340, 487, -24, 498, 487, 394,
578-
421, 243, 208, 448, 475, 498, -24, 16, 16, 122,
578+
421, 243, 208, 448, 475, 498, -24, 16, 16, 17,
579579
17, -22, 26, -35, 172, -35, 92, -35, -35, 92,
580580
-35, 21, 367
581581
};
@@ -629,8 +629,8 @@ static const yytype_int8 yytable[] =
629629
0, 5, 6, 0, 0, 0, 7, 0, 5, 6,
630630
0, 0, 8, 7, 0, 0, 0, 0, 0, 54,
631631
22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
632-
32, 33, 34, 35, 45, 46, 0, 47, 36, 37,
633-
48, 38, 39, 40, 41, 42, 43, 44, 45, 46,
632+
32, 33, 34, 35, 0, 0, 0, 0, 36, 37,
633+
0, 38, 39, 40, 41, 42, 43, 44, 45, 46,
634634
0, 47, 0, 0, 48, 85, 22, 23, 24, 25,
635635
26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
636636
0, 0, 0, 0, 36, 37, 0, 38, 39, 40,
@@ -687,8 +687,8 @@ static const yytype_int8 yycheck[] =
687687
-1, 29, 30, -1, -1, -1, 34, -1, 29, 30,
688688
-1, -1, 40, 34, -1, -1, -1, -1, -1, 40,
689689
4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
690-
14, 15, 16, 17, 32, 33, -1, 35, 22, 23,
691-
38, 25, 26, 27, 28, 29, 30, 31, 32, 33,
690+
14, 15, 16, 17, -1, -1, -1, -1, 22, 23,
691+
-1, 25, 26, 27, 28, 29, 30, 31, 32, 33,
692692
-1, 35, -1, -1, 38, 39, 4, 5, 6, 7,
693693
8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
694694
-1, -1, -1, -1, 22, 23, -1, 25, 26, 27,

tests/PrecedenceTest.cpp

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include "PrecedenceTest.hpp"
2+
3+
void PrecedenceTest::SetUp()
4+
{
5+
m_globalMemory = projectm_eval_memory_buffer_create();
6+
m_context = projectm_eval_context_create(m_globalMemory, &m_globalRegisters);
7+
}
8+
9+
void PrecedenceTest::TearDown()
10+
{
11+
projectm_eval_context_destroy(m_context);
12+
projectm_eval_memory_buffer_destroy(m_globalMemory);
13+
memset(&m_globalRegisters, 0, sizeof(m_globalRegisters));
14+
}
15+
16+
TEST_F(PrecedenceTest, DivisionMultiplication)
17+
{
18+
auto code1 = projectm_eval_code_compile(m_context, "3.0 * 2.0 / 5.0 * 7.0;");
19+
auto code2 = projectm_eval_code_compile(m_context, "2.0 / 5.0 * 3.0 * 7.0;");
20+
auto code3 = projectm_eval_code_compile(m_context, "3.0 * 7.0 * 2.0 / 5.0;");
21+
22+
auto ret1 = projectm_eval_code_execute(code1);
23+
auto ret2 = projectm_eval_code_execute(code2);
24+
auto ret3 = projectm_eval_code_execute(code3);
25+
26+
projectm_eval_code_destroy(code1);
27+
projectm_eval_code_destroy(code2);
28+
projectm_eval_code_destroy(code3);
29+
30+
ASSERT_FLOAT_EQ(ret1, 8.4);
31+
ASSERT_FLOAT_EQ(ret1, ret2);
32+
ASSERT_FLOAT_EQ(ret2, ret3);
33+
ASSERT_FLOAT_EQ(ret1, ret3);
34+
35+
}
36+
37+
TEST_F(PrecedenceTest, MultiplicationModulo)
38+
{
39+
auto code1 = projectm_eval_code_compile(m_context, "3.0 * 2.0 % 5.0 * 7.0;");
40+
auto code2 = projectm_eval_code_compile(m_context, "2.0 % 5.0 * 3.0 * 7.0;");
41+
auto code3 = projectm_eval_code_compile(m_context, "3.0 * 7.0 * 2.0 % 5.0;");
42+
43+
auto ret1 = projectm_eval_code_execute(code1);
44+
auto ret2 = projectm_eval_code_execute(code2);
45+
auto ret3 = projectm_eval_code_execute(code3);
46+
47+
projectm_eval_code_destroy(code1);
48+
projectm_eval_code_destroy(code2);
49+
projectm_eval_code_destroy(code3);
50+
51+
ASSERT_FLOAT_EQ(ret1, 42.0);
52+
ASSERT_FLOAT_EQ(ret1, ret2);
53+
ASSERT_FLOAT_EQ(ret2, ret3);
54+
ASSERT_FLOAT_EQ(ret1, ret3);
55+
}
56+

tests/PrecedenceTest.hpp

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#pragma once
2+
3+
#include <gtest/gtest.h>
4+
5+
#include <vector>
6+
7+
#include <projectm-eval/api/projectm-eval.h>
8+
9+
class PrecedenceTest : public testing::Test
10+
{
11+
public:
12+
13+
protected:
14+
15+
void SetUp() override;
16+
17+
void TearDown() override;
18+
19+
struct projectm_eval_context* m_context{};
20+
projectm_eval_mem_buffer m_globalMemory{};
21+
PRJM_EVAL_F m_globalRegisters[100]{};
22+
};

0 commit comments

Comments
 (0)