Hydrogen-python/syntax/rule.py
2025-06-12 00:05:54 +08:00

662 lines
20 KiB
Python

class Sign:
"""
符号
"""
def __init__(self, sign_type, sign_str='', sign_line=-1):
"""
构造
:param sign_type: 符号的类型
:param sign_str: 符号的内容(可以为空)
:param sign_line: 符号所在行数(可以为空)
"""
self.type = sign_type
self.str = sign_str
self.line = sign_line
def is_terminal_sign(self):
"""
是不是终结符
:return: True/False
"""
if self.type == 'empty':
return True
else:
for i in terminal_sign_type:
if i == self.type:
return True
return False
def is_non_terminal_sign(self):
"""
是不是非终结符
:return: True/False
"""
for i in non_terminal_sign_type:
if i == self.type:
return True
return False
def is_empty_sign(self):
"""
是不是空字
:return: True/False
"""
return self.type == 'empty'
class Production:
"""
产生式
"""
cnt = 0
def __init__(self, left_type, right_types, semantic_start, semantic_children, semantic_end):
"""
产生式左边
:param left_type: 产生式左边的符号类型
:param right_types: 产生式右边的符号类型列表
:param semantic_start: 语义操作关键字 - 开始
:param semantic_children: 语义操作关键字 - 孩子
:param semantic_end: 语义操作关键字 - 结束
"""
self.cnt = Production.cnt
Production.cnt += 1
self.left = Sign(left_type)
self.right = list()
for i in right_types:
self.right.append(Sign(i))
# 调试用的
self.str1 = self.left.type + ' ->'
for i in self.right:
self.str1 += ' ' + i.type
if len(self.right)==0:
self.str1 += ' empty'
self.str = [self.str1,self.cnt]
# 语义操作关键字
self.semantic_start = semantic_start
self.semantic_children = list()
for c in semantic_children:
self.semantic_children.append(c)
self.semantic_end = semantic_end
def __str__(self):
return self.str[0]
"""
1. program -> define-list
2. define-list -> define define-list
| empty
3. define -> type ID define-type
4. define-type -> var-define-follow
| fun-define-follow
5. var-define-follow -> ;
| [ NUM ] ;
6. type -> int
| void
7. fun-define-follow -> ( params ) code-block
8. params -> param-list
| empty
9. param-list -> param param-follow
10. param-follow -> , param param-follow
| empty
11. param -> type ID array-subscript
12. array-subscript -> [ ]
| empty
13. code-block -> { local-define-list code-list }
14. local-define-list -> local-var-define local-define-list
| empty
15. local-var-define -> type ID var-define-follow
16. code-list -> code code-list
| empty
17. code -> normal-statement
| selection-statement
| iteration-statement
| return-statement
18. normal-statement -> ;
| ID normal-statement-follow
19. normal-statement-follow -> var-follow = exp ;
| call-follow ;
20. call-follow -> ( call-params )
21. call-params -> call-param-list
| empty
22. call-param-list -> exp call-param-follow
23. call-param-follow -> , exp call-param-follow
| empty
24. selection-statement -> if ( exp ) { code-list } selection-follow
25. selection-follow -> else { code-list }
| empty
26. iteration-statement -> while ( exp ) iteration-follow
27. iteration-follow -> { code-list }
| code
28. return-statement -> return return-follow
29. return-follow -> ;
| exp ;
30. var-follow -> [ exp ]
| empty
31. exp -> additive-expr exp-follow
32. exp-follow -> rel-op additive-expr
| empty
33. rel-op -> <=
| <
| >
| >=
| ==
| !=
34. additive-expr -> term additive-expr-follow
35. additive-expr-follow -> add-op term additive-expr-follow
| empty
36. add-op -> +
| -
37. term -> factor term-follow
38. term-follow -> mul-op factor term-follow
| empty
39. mul-op -> *
| /
40. factor -> ( exp )
| ID id-factor-follow | NUM
41. id-factor-follow -> var-follow
| ( args )
42. args -> arg-list
| empty
43. arg-list -> exp arg-list-follow
44. arg-list-follow -> , exp arg-list-follow
| empty
"""
# 所有终结符的类型
terminal_sign_type = [
'fn',
'else',
'if',
'int',
'return',
'void',
'while',
'addition',
'subtraction',
'multiplication',
'division',
'bigger',
'bigger-equal',
'smaller',
'smaller-equal',
'equal',
'not-equal',
'evaluate',
'semicolon',
'comma',
'left-parentheses',
'right-parentheses',
'left-bracket',
'right-bracket',
'left-brace',
'right-brace',
'float-num',
'int-num',
'id',
'colon',
'right-arrow',
'i32',
'f32',
# 在这之前添加非终结符类型,请务必不要动 'pound'
'pound'
]
# 所有非终结符的类型
non_terminal_sign_type = [
'program',
'define-lists',
'define-list',
'define',
'define-type',
'var-define-follow',
'type',
'fun-define',
'fun-define-follow',
'params',
'param-list',
'param-follow',
'param',
'arraylist',
'code-block',
'local-define-list',
'local-var-define',
'code-list',
'code',
'normal-statement',
'normal-statement-follow',
'call-follow',
'call-params',
'call-param-list',
'call-param-follow',
'selection-statement',
'selection-follow',
'iteration-statement',
'iteration-follow',
'return-statement',
'return-follow',
# 'eval-statement',
# 'var',
'var-follow',
'exp',
'exp-follow',
'rel-op',
'additive-expr',
'additive-expr-follow',
'add-op',
'term',
'term-follow',
'mul-op',
'factor',
'id-factor-follow',
'args',
'arg-list',
'arg-list-follow',
'global-var-define',
'fun-return',
'paramlist',
'arraylist',
'global-var-define-follow',
'local-define',
'local-define-follow',
'arraylist-with-num'
]
"""
0. program -> define-lists
1. define-lists -> define-list define-lists
2. define-lists ->
3. define-list -> fun-define
4. define-list -> global-var-define
5. fun-define -> fn id left-parentheses params right-parentheses fun-return left-brace code-block right-brace
6. params ->
7. params -> paramlist
8. paramlist -> param param-follow
9. param-follow -> comma param-follow
10. param-follow ->
11. param -> id colon type arraylist
12. arraylist ->
13. arraylist -> left-bracket right-bracket
14. fun-return ->
15. fun-return -> right-arrow type arraylist
16. type -> i32
17. type -> f32
18. type -> void
19. global-var-define -> type arraylist id global-var-define-follow
20. global-var-define-follow -> comma id global-var-define-follow
21. global-var-define-follow -> semicolon
22. code-block -> code-list
23. code-list -> code code-list
24. code-list ->
25. code -> local-define
26. code -> normal-statement
27. code -> selection-statement
28. code -> iteration-statement
29. code -> return-statement
30. local-define -> type arraylist id local-define-follow
31. local-define-follow -> comma id local-define-follow
32. local-define-follow -> semicolon
33. normal-statement -> semicolon
34. normal-statement -> id normal-statement-follow
35. normal-statement-follow -> var-follow equal exp semicolon
36. normal-statement-follow -> call-follow semicolon
37. var-follow ->
38. var-follow -> left-bracket exp right-bracket
39. call-follow -> left-parentheses call-params right-parentheses
40. call-params -> call-param-list
41. call-params ->
42. call-param-list -> exp call-param-follow
43. call-param-follow -> comma exp call-param-follow
44. call-param-follow ->
45. selection-statement -> if exp left-brace code-list right-brace selection-follow
46. selection-follow -> else left-brace code-list right-brace
47. selection-follow ->
48. iteration-statement -> while exp left-brace code-list right-brace
49. return-statement -> return return-follow
50. return-follow -> semicolon
51. return-follow -> exp semicolon
52. exp -> additive-expr exp-follow
53. exp-follow -> rel-op additive-expr
54. exp-follow ->
55. rel-op -> smaller-equal
56. rel-op -> smaller
57. rel-op -> bigger
58. rel-op -> bigger-equal
59. rel-op -> equal
60. rel-op -> not-equal
61. additive-expr -> term additive-expr-follow
62. additive-expr-follow -> add-op term additive-expr-follow
63. additive-expr-follow ->
64. add-op -> addition
65. add-op -> subtraction
66. term -> factor term-follow
67. term-follow -> mul-op factor term-follow
68. term-follow ->
69. mul-op -> multiplication
70. mul-op -> division
71. factor -> left-parentheses exp right-parentheses
72. factor -> id id-factor-follow
73. factor -> num
74. id-factor-follow -> var-follow
75. id-factor-follow -> left-parentheses args right-parentheses
76. args -> arg-list
77. args ->
78. arg-list -> exp arg-list-follow
79. arg-list-follow -> comma exp arg-list-follow
80. arg-list-follow ->
"""
# 文法产生式
productions = [
# 0
Production('program', ['define-lists'],
'Program0S', [None], 'Program0E'),
# 1
Production('define-lists', ['define-list', 'define-lists'],
None, [None, None], 'DefineLists1E'),
# 2
Production('define-lists', [],
None, [], 'DefineLists2E'),
# 3
Production('define-list', ['fun-define'],
None, [None], 'DefineList3E',
),
# 4
Production('define-list', ['global-var-define'],
None, [None], 'DefineList4E',
),
# 5
Production('fun-define',
['fn', 'id', 'left-parentheses', 'params', 'right-parentheses', 'fun-return', 'left-brace', 'code-block',
'right-brace'],
None, [None, None, None, 'FunDefine5C3', None, 'FunDefine5C5', None, 'FunDefine5C7', None], 'FunDefine5E',
),
# 6
Production('params', [],
'Params6S', [], None,
),
# 7
Production('params', ['paramlist'],
'Params7S', ['Params7C0'], None,
),
# 8
Production('paramlist', ['param', 'param-follow'],
None, ['ParamList8C0', 'ParamList8C1'], None,
),
# 9
Production('param-follow', ['comma', 'param', 'param-follow'],
None, [None, 'ParamFollow9C1', 'ParamFollow9C2'], None,
),
# 10
Production('param-follow', [],
None, [], None,
),
# 11
Production('param', ['id', 'colon', 'type', 'arraylist'],
None, [None, None, None, None], 'Param11E',
),
# 12
Production('arraylist', [],
'ArrayList12S', [], None,
),
# 13
Production('arraylist', ['left-bracket', 'right-bracket'],
'ArrayList13S', [None, None], None,
),
# 14
Production('fun-return', [],
'FunReturn14S', [], None,
),
# 15
Production('fun-return', ['right-arrow', 'type', 'arraylist'],
None, [None, None, None], 'FunReturn15E',
),
# 16
Production('type', ['i32'],
'Type16S', [None], None,
),
# 17
Production('type', ['f32'],
'Type17S', [None], None,
),
# 18
Production('type', ['void'],
"Type18S", [None], None,
),
# 19
Production('global-var-define', ['type', 'arraylist-with-num', 'id', 'global-var-define-follow'],
None, [None, None, None, 'GlobalVarDefine19C3'], 'GlobalVarDefine19E',
),
# 20
Production('global-var-define-follow', ['comma', 'id', 'global-var-define-follow'],
None, [None, None, 'GlobalVarDefineFllow20C2'], 'GlobalVarDefineFllow20E',
),
# 21
Production('global-var-define-follow', ['semicolon'],
None, [None], None,
),
# 22
Production('code-block', ['code-list'],
None, ['CodeBlock22C0'], 'CodeBlock22E',
),
# 23
Production('code-list', ['code', 'code-list'],
None, ["CodeList23C0", 'CodeList23C1'], 'CodeList23E',
),
# 24
Production('code-list', [],
None, [], 'CodeList24E',
),
# 25
Production('code', ['local-define'],
None, ['Code25C0'], 'Code25E',
),
# 26
Production('code', ['normal-statement'],
None, ['Code26C0'], 'Code26E',
),
# 27
Production('code', ['selection-statement'],
None, ['Code27C0'], 'Code27E',
),
# 28
Production('code', ['iteration-statement'],
None, ['Code28C0'], 'Code28E',
),
# 29
Production('code', ['return-statement'],
None, ['Code29C0'], 'Code29E',
),
# 30
Production('local-define', ['type', 'arraylist-with-num', 'id', 'local-define-follow'],
None, ['LocalDefine30C0', "LocalDefine30C1", 'LocalDefine30C2', 'LocalDefine30C3'], 'LocalDefine30E',
),
# 31
Production('local-define-follow', ['comma', 'id', 'local-define-follow'],
None, [None, 'LocalDefineFollow31C1', 'LocalDefineFollow31C2'], 'LocalDefineFollow31E',
),
# 32
Production('local-define-follow', ['semicolon'],
None, [None], None,
),
# # 33
# Production('normal-statement', ['semicolon'],
# None, [None], None,
# ),
# # 34
# Production('normal-statement', ['id', 'normal-statement-follow'],
# None, [None, None], None,
# ),
# # 35
# Production('normal-statement-follow', ['var-follow', 'equal', 'exp', 'semicolon'],
# None, [None, None, None, None], None,
# ),
# # 36
# Production('normal-statement-follow', ['call-follow', 'semicolon'],
# None, [None], None,
# ),
# # 37
# Production('var-follow', [],
# None, [], None,
# ),
# # 38
# Production('var-follow', ['left-bracket', 'exp', 'right-bracket'],
# None, [None, None, None], None,
# ),
# # 39
# Production('call-follow', ['left-parentheses', 'call-params', 'right-parentheses'],
# None, [None, None, None], None,
# ),
# # 40
# Production('call-params', ['call-param-list'],
# None, [None], None,
# ),
# # 41
# Production('call-params', [],
# None, [], None,
# ),
# # 42
# Production('call-param-list', ['exp', 'call-param-follow'],
# None, [None, None], None,
# ),
# # 43
# Production('call-param-follow', ['comma', 'exp', 'call-param-follow'],
# None, [None, None, None], None,
# ),
# # 44
# Production('call-param-follow', [],
# None, [], None,
# ),
# # 45
# Production('selection-statement', ['if', 'exp', 'left-brace', 'code-list', 'right-brace', 'selection-follow'],
# None, [None, None, None, None, None, None], None,
# ),
# # 46
# Production('selection-follow', ['else', 'left-brace', 'code-list', 'right-brace'],
# None, [None, None, None, None], None,
# ),
# # 47
# Production('selection-follow', [],
# None, [], None,
# ),
# # 48
# Production('iteration-statement', ['while', 'exp', 'left-brace', 'code-list', 'right-brace'],
# None, [None, None, None, None, None], None,
# ),
# # 49
# Production('return-statement', ['return', 'return-follow'],
# None, [None, None], None,
# ),
# # 50
# Production('return-follow', ['semicolon'],
# None, [None], None,
# ),
# # 51
# Production('return-follow', ['exp', 'semicolon'],
# None, [None, None], None,
# ),
# 52
Production('exp', ['additive-expr', 'exp-follow'],
None, ['Exp52C0', 'Exp52C1'], 'Exp52E'),
# 53
Production('exp-follow', ['rel-op', 'additive-expr'],
None, [None, 'ExpFollow53C1'], 'ExpFollow53E'),
# 54
Production('exp-follow', [],
None, [], 'ExpFollow54E'),
# 55
Production('rel-op', ['smaller-equal'],
None, [None], 'RelOp55E'),
# 56
Production('rel-op', ['smaller'],
None, [None], 'RelOp56E'),
# 57
Production('rel-op', ['bigger'],
None, [None], 'RelOp57E'),
# 58
Production('rel-op', ['bigger-equal'],
None, [None], 'RelOp58E'),
# 59
Production('rel-op', ['equal'],
None, [None], 'RelOp59E'),
# 60
Production('rel-op', ['not-equal'],
None, [None], 'RelOp60E'),
# 61
Production('additive-expr', ['term', 'additive-expr-follow'],
None, ['AdditiveExpr61C0', 'AdditiveExpr61C1'], 'AdditiveExpr61E'),
# 62
Production('additive-expr-follow', ['add-op', 'term', 'additive-expr-follow'],
None, [None, 'AdditiveExprFollow62C1', 'AdditiveExprFollow62C2'], 'AdditiveExprFollow62E'),
# 63
Production('additive-expr-follow', [],
None, [], 'AdditiveExprFollow63E'),
# 64
Production('add-op', ['addition'],
None, [None], 'AddOp64E'),
# 65
Production('add-op', ['subtraction'],
None, [None], 'AddOp65E'),
# 66
Production('term', ['factor', 'term-follow'],
None, ['Term66C0', 'Term66C1'], 'Term66E'),
# 67
Production('term-follow', ['mul-op', 'factor', 'term-follow'],
None, [None, 'TermFollow67C1', 'TermFollow67C2'], 'TermFollow67E'),
# 68
Production('term-follow', [],
None, [], 'TermFollow68E'),
# 69
Production('mul-op', ['multiplication'],
None, [None], 'MulOp69E'),
# 70
Production('mul-op', ['division'],
None, [None], 'MulOp70E'),
# 71
Production('factor', ['left-parentheses', 'exp', 'right-parentheses'],
None, [None, 'Factor71C1', None], 'Factor71E'),
# 72
Production('factor', ['id', 'id-factor-follow'],
None, [None, 'Factor72C1'], 'Factor72E'),
# 73
Production('factor', ['num'],
None, [None], 'Factor73E'),
# 74
Production('id-factor-follow', ['var-follow'],
None, [None], 'IdFactorFollow74E'),
# 75
Production('id-factor-follow', ['left-parentheses', 'args', 'right-parentheses'],
None, [None, 'IdFactorFollow75C1', None], 'IdFactorFollow75E'),
# 76
Production('args', ['arg-list'],
None, ['Args76C0'], 'Args76E'),
# 77
Production('args', [],
None, [], 'Args77E'),
# 78
Production('arg-list', ['exp', 'arg-list-follow'],
None, ['ArgList78C0', 'ArgList78C1'], 'ArgList78E'),
# 79
Production('arg-list-follow', ['comma', 'exp', 'arg-list-follow'],
None, [None, 'ArgListFollow79C1', 'ArgListFollow79C2'], 'ArgListFollow79E'),
# 80
Production('arg-list-follow', [],
None, [], 'ArgListFollowE'),
# 81
Production('arraylist-with-num', [],
None, [], 'ArrayListWithNum81E',
),
# 82
Production('arraylist-with-num', ['left-bracket', 'int-num', 'right-bracket'],
None, [None, None, None], 'ArrayListWithNum82E',
)
]
# 文法开始符号
grammar_start = Sign('program')