[Feature] 写完了 打死不改了

This commit is contained in:
lichx 2024-12-24 16:17:20 +08:00
parent 3b735a43b8
commit e92384f424
10 changed files with 1308 additions and 48 deletions

View File

@ -233,6 +233,8 @@ namespace CompilerDesignIFlr1
grammar.Add(subValue.Trim()); grammar.Add(subValue.Trim());
else if (TokenUnit.ContainsKey(subValue.Trim())) else if (TokenUnit.ContainsKey(subValue.Trim()))
grammar.Add(subValue.Trim()); grammar.Add(subValue.Trim());
else if (subValue.StartsWith('(') && subValue.EndsWith(')'))
grammar.Add(GrammarUnitCreate(subValue.Substring(1, subValue.Length - 2)));
else else
{ {
if (subValue.Trim().Length == 0) if (subValue.Trim().Length == 0)

View File

@ -49,9 +49,24 @@ namespace CompilerDesignIFlr1
Grammar = grammar; Grammar = grammar;
} }
public LR1Unit(int id, string type, string name, int quadrupleIndex, string value, HashSet<string> prospect, int pointPosition, List<string> grammar)
{
Id = id;
Type = type;
Name = name;
QuadrupleIndex = quadrupleIndex;
Value = value;
Prospect = prospect;
PointPosition = pointPosition;
Grammar = grammar;
}
internal LR1Unit Clone() =>
new LR1Unit(Id, Type, Name, 0, Value,new HashSet<string>(Prospect), PointPosition, [.. Grammar]);
internal int Id { get; set; } = -1; internal int Id { get; set; } = -1;
internal string Type { get; set; } = ""; internal string Type { get; set; } = "";
internal string Name { get; set; } = ""; internal string Name { get; set; } = "";
internal int QuadrupleIndex { get; set; } = 0;
internal string Value { get; set; } = ""; internal string Value { get; set; } = "";
internal HashSet<string> Prospect { get; set; } = []; internal HashSet<string> Prospect { get; set; } = [];
internal int PointPosition { get; set; } = 0; internal int PointPosition { get; set; } = 0;
@ -93,9 +108,6 @@ namespace CompilerDesignIFlr1
return sb.ToString(); return sb.ToString();
} }
internal LR1Unit Clone() =>
new LR1Unit(Id, Type, Name, new HashSet<string>(Prospect), PointPosition, [.. Grammar]);
public override bool Equals(object? obj) public override bool Equals(object? obj)
{ {
if (obj is not LR1Unit other) if (obj is not LR1Unit other)

View File

@ -78,16 +78,16 @@ namespace CompilerDesignIflr1
temp.Value = s; temp.Value = s;
ans.Add(temp); ans.Add(temp);
} }
else if (Symbol.TryGetValue(s, out var symbol)) else if(i + 1 < list.Count && Symbol.TryGetValue(s + list[i + 1], out var symbol))
{ {
var temp = symbol.Clone(); var temp = symbol.Clone();
if (i + 1 < list.Count && Symbol.TryGetValue(s + list[i + 1], out symbol))
{
temp = symbol.Clone();
temp.Value = s + list[i + 1]; temp.Value = s + list[i + 1];
i++; i++;
ans.Add(temp);
} }
else else if (Symbol.TryGetValue(s, out symbol))
{
var temp = symbol.Clone();
temp.Value = s; temp.Value = s;
ans.Add(temp); ans.Add(temp);
} }
@ -96,7 +96,8 @@ namespace CompilerDesignIflr1
bool noAnswer = true; bool noAnswer = true;
foreach (var (pattern, ut) in Patterns) foreach (var (pattern, ut) in Patterns)
{ {
if (Regex.IsMatch(s, pattern))
if (Regex.IsMatch(s, '^' + pattern + '$'))
{ {
var temp = ut.Clone(); var temp = ut.Clone();
temp.Value = s; temp.Value = s;
@ -118,7 +119,7 @@ namespace CompilerDesignIflr1
{ {
List<string> lt = new List<string>(); List<string> lt = new List<string>();
int l = 0; int l = 0;
int r = 1; int r = 0;
while (r < s.Length) while (r < s.Length)
{ {
@ -130,8 +131,19 @@ namespace CompilerDesignIflr1
lt.Add(k); lt.Add(k);
} }
k = s[r].ToString().Trim(); k = s[r].ToString().Trim();
if (k.Length != 0) if (k.Length != 0)
{ {
if(k is "\'" or "\"")
{
l = r;
int temp = r + 1;
while (temp < s.Length && s[temp].ToString().Trim() != k)
temp++;
lt.Add(s.Substring(l, temp - l + 1));
r = temp;
}
else
lt.Add(k); lt.Add(k);
} }
l = r + 1; l = r + 1;

View File

@ -7,4 +7,6 @@ var grammarReader = new GrammarReader("./files/if-grammar.grammar");
var lr1Creator = new LR1Creator(grammarReader); var lr1Creator = new LR1Creator(grammarReader);
var lr1Table = new LR1Table(lr1Creator); var lr1Table = new LR1Table(lr1Creator);
var lexicalAnalysis = new LexicalAnalysis(lr1Creator, "./files/code"); var lexicalAnalysis = new LexicalAnalysis(lr1Creator, "./files/code");
var stateMachine = new StateMachine(lr1Table, lexicalAnalysis, lr1Creator); var semanticAnalysis = new SemanticAnalysis();
var stateMachine = new StateMachine(lr1Table, lexicalAnalysis, lr1Creator, semanticAnalysis);
semanticAnalysis.PrintQuadruples();

File diff suppressed because it is too large Load Diff

View File

@ -12,15 +12,17 @@ namespace CompilerDesignIFlr1
internal LR1Table Table; internal LR1Table Table;
internal LexicalAnalysis AnalysisResult; internal LexicalAnalysis AnalysisResult;
internal LR1Creator Creator; internal LR1Creator Creator;
internal List<(LR1Unit, int)> stack = [(new LR1Unit("End","#"),0)]; internal List<(LR1Unit, int)> _Stack = [(new LR1Unit("End","#"),0)];
internal Stack<LR1Unit> Tokens; internal Stack<LR1Unit> Tokens;
internal SemanticAnalysis SemanticAnalysis;
internal StateMachine(LR1Table table, LexicalAnalysis analysis, LR1Creator creator) internal StateMachine(LR1Table table, LexicalAnalysis analysis, LR1Creator creator, SemanticAnalysis semanticAnalysis)
{ {
Table = table; Table = table;
AnalysisResult = analysis; AnalysisResult = analysis;
Creator = creator; Creator = creator;
Tokens = AnalysisResult.GetStack(); Tokens = AnalysisResult.GetStack();
SemanticAnalysis = semanticAnalysis;
Compute(); Compute();
} }
@ -35,23 +37,26 @@ namespace CompilerDesignIFlr1
internal bool ComputeOnce(LR1Unit unit) internal bool ComputeOnce(LR1Unit unit)
{ {
var (action, destination) = Table.Rows[stack[^1].Item2].Next(unit.Name); var (action, destination) = Table.Rows[_Stack[^1].Item2].Next(unit.Name);
switch (action) switch (action)
{ {
case "GOTO": case "GOTO":
stack.Add((unit, destination)); _Stack.Add((unit, destination));
SemanticAnalysis.ShiftAnalysis(unit);
break; break;
case "Reduce": case "Reduce":
var reduceUnit = Creator.UnitIndex[destination]; var reduceUnit = Creator.UnitIndex[destination];
if (reduceUnit.CanReduce(stack.Select(x => x.Item1).ToList())) if (reduceUnit.CanReduce(_Stack.Select(x => x.Item1).ToList()))
{ {
stack.RemoveRange(stack.Count - reduceUnit.Grammar.Count, reduceUnit.Grammar.Count); var vals = _Stack.Skip(_Stack.Count - reduceUnit.Grammar.Count).Take(reduceUnit.Grammar.Count).Select(x=>x.Item1) .ToList();
reduceUnit = SemanticAnalysis.Analysis(vals, reduceUnit.Clone());
_Stack.RemoveRange(_Stack.Count - reduceUnit.Grammar.Count, reduceUnit.Grammar.Count);
} }
else else
throw new Exception("Reduce not allow."); throw new Exception("Reduce not allow.");
Console.WriteLine(reduceUnit); Console.WriteLine(reduceUnit);
Tokens.Push(unit); Tokens.Push(unit);
Tokens.Push(reduceUnit.Clone()); Tokens.Push(reduceUnit);
break; break;
case "ACC": case "ACC":
Console.WriteLine(Creator.UnitIndex[destination]); Console.WriteLine(Creator.UnitIndex[destination]);

View File

@ -1,9 +1,12 @@
int i=0,t,b=15; {
if(i>=10) int a =1*9+2;
if(k==9) if(a>9){
h = 6; a=a+1;
else if(9>1){
{ a=10;
c=10; }
if(k<=95 && ) a=2+2;
}
} }

View File

@ -3,17 +3,25 @@
} }
StatementList { StatementList {
Statement* LBrace Statement* RBrace
} }
@skip { Whitespace } @skip { Whitespace }
IfStatement { IfStatement {
If LParen ConditionalExpression RParen PartIfStatement Else Statement | If LParen ConditionalExpression RParen Statement If ConditionPart PartIfStatement Else Statement | If ConditionPart Statement
} }
PartIfStatement { PartIfStatement {
If LParen ConditionalExpression RParen PartIfStatement Else PartIfStatement | NoIfStatement If ConditionPart PartIfStatement Else PartIfStatement | NoIfStatement
}
ConditionPart {
LParen Condition RParen
}
Condition {
ConditionalExpression (LogicalOperator ConditionalExpression)*
} }
ConditionalExpression { ConditionalExpression {
@ -45,7 +53,7 @@ ConstantDefinition {
} }
VariableDefinition { VariableDefinition {
Type (Identifier | AssignmentStatement)+ (Comma Identifier | Comma AssignmentStatement)* Type (Identifier | AssignmentStatement) (Comma Identifier | Comma AssignmentStatement)*
} }
Type { Type {
@ -69,7 +77,11 @@ Number {
} }
Operator { Operator {
EuqalTo | NotEqualTo | LessThan | GreaterThan | LessThanOrEqual | GreaterThanOrEqual EqualTo | NotEqualTo | LessThan | GreaterThan | LessThanOrEqual | GreaterThanOrEqual
}
LogicalOperator {
And | Or
} }
@tokens { @tokens {
@ -93,7 +105,7 @@ Operator {
UnsignedNumber { $[0-9]+ } UnsignedNumber { $[0-9]+ }
String { "\"" $[\x00-\x7F]* "\"" } String { "\"" $[\x00-\x7F]* "\"" }
Character { "'" $[\x00-\x7F] "'" } Character { "'" $[\x00-\x7F] "'" }
EuqalTo { "==" } EqualTo { "==" }
NotEqualTo { "!=" } NotEqualTo { "!=" }
LessThan { "<" } LessThan { "<" }
GreaterThan { ">" } GreaterThan { ">" }
@ -101,4 +113,6 @@ Operator {
GreaterThanOrEqual { ">=" } GreaterThanOrEqual { ">=" }
Equal { "=" } Equal { "=" }
Whitespace { $[\t\n\r]+ } Whitespace { $[\t\n\r]+ }
And { "&&" }
Or { "||" }
} }

View File

@ -0,0 +1,88 @@
文法:
key: Program
0 Program ::= . StatementList
key: StatementList
1 StatementList ::= . LBrace Statement_0 RBrace
key: IfStatement
2 IfStatement ::= . If ConditionPart PartIfStatement Else Statement
3 IfStatement ::= . If ConditionPart Statement
key: PartIfStatement
4 PartIfStatement ::= . If ConditionPart PartIfStatement Else PartIfStatement
5 PartIfStatement ::= . NoIfStatement
key: ConditionPart
6 ConditionPart ::= . LParen Condition RParen
key: Condition
7 Condition ::= . ConditionalExpression LogicalOperator_ConditionalExpression_0
key: ConditionalExpression
8 ConditionalExpression ::= . Expression Operator Expression
9 ConditionalExpression ::= . Expression
key: Expression
10 Expression ::= . Term AddLike_Term_0
key: Statement
11 Statement ::= . IfStatement
12 Statement ::= . NoIfStatement
key: NoIfStatement
13 NoIfStatement ::= . AssignmentStatement Semicolon
14 NoIfStatement ::= . VariableDefinition Semicolon
15 NoIfStatement ::= . LBrace Statement_1 RBrace
16 NoIfStatement ::= . ConstantDefinition Semicolon
17 NoIfStatement ::= . Semicolon
key: AssignmentStatement
18 AssignmentStatement ::= . Identifier Equal Expression
key: Term
19 Term ::= . Factor MultiplyLike_Factor_0
key: ConstantDefinition
20 ConstantDefinition ::= . Const VariableDefinition
key: VariableDefinition
21 VariableDefinition ::= . Type Identifier__AssignmentStatement_0 Comma_Identifier__Comma_AssignmentStatement_0
key: Type
22 Type ::= . Int
23 Type ::= . Char
key: Factor
24 Factor ::= . Identifier
25 Factor ::= . Number
26 Factor ::= . Character
27 Factor ::= . LParen Expression RParen
key: AddLike
28 AddLike ::= . Plus
29 AddLike ::= . Minus
key: MultiplyLike
30 MultiplyLike ::= . Multiply
31 MultiplyLike ::= . Divide
32 MultiplyLike ::= . Modulo
key: Number
33 Number ::= . UnsignedNumber
34 Number ::= . Minus UnsignedNumber
35 Number ::= . Plus UnsignedNumber
key: Operator
36 Operator ::= . EqualTo
37 Operator ::= . NotEqualTo
38 Operator ::= . LessThan
39 Operator ::= . GreaterThan
40 Operator ::= . LessThanOrEqual
41 Operator ::= . GreaterThanOrEqual
key: LogicalOperator
42 LogicalOperator ::= . And
43 LogicalOperator ::= . Or
key: Statement_0
44 Statement_0 ::= .
45 Statement_0 ::= . Statement Statement_0
key: LogicalOperator_ConditionalExpression_0
46 LogicalOperator_ConditionalExpression_0 ::= .
47 LogicalOperator_ConditionalExpression_0 ::= . LogicalOperator ConditionalExpression LogicalOperator_ConditionalExpression_0
key: AddLike_Term_0
48 AddLike_Term_0 ::= .
49 AddLike_Term_0 ::= . AddLike Term AddLike_Term_0
key: Statement_1
50 Statement_1 ::= .
51 Statement_1 ::= . Statement Statement_1
key: MultiplyLike_Factor_0
52 MultiplyLike_Factor_0 ::= .
53 MultiplyLike_Factor_0 ::= . MultiplyLike Factor MultiplyLike_Factor_0
key: Identifier__AssignmentStatement_0
54 Identifier__AssignmentStatement_0 ::= . Identifier
55 Identifier__AssignmentStatement_0 ::= . AssignmentStatement
key: Comma_Identifier__Comma_AssignmentStatement_0
56 Comma_Identifier__Comma_AssignmentStatement_0 ::= .
57 Comma_Identifier__Comma_AssignmentStatement_0 ::= . Comma Identifier Comma_Identifier__Comma_AssignmentStatement_0
58 Comma_Identifier__Comma_AssignmentStatement_0 ::= . Comma AssignmentStatement Comma_Identifier__Comma_AssignmentStatement_0

View File

@ -0,0 +1,90 @@
文法:
key: Program
0 Program ::= . StatementList
key: StatementList
1 StatementList ::= . LBrace Statement_0 RBrace
key: IfStatement
2 IfStatement ::= . If ConditionPart PartIfStatement Else Statement
3 IfStatement ::= . If ConditionPart Statement
key: PartIfStatement
4 PartIfStatement ::= . If ConditionPart PartIfStatement Else PartIfStatement
5 PartIfStatement ::= . NoIfStatement
key: ConditionPart
6 ConditionPart ::= . LParen Condition RParen
key: Condition
7 Condition ::= . ConditionalExpression LogicalOperator_ConditionalExpression_0
key: ConditionalExpression
8 ConditionalExpression ::= . Expression Operator Expression
9 ConditionalExpression ::= . Expression
key: Expression
10 Expression ::= . Term AddLike_Term_0
key: Statement
11 Statement ::= . IfStatement
12 Statement ::= . NoIfStatement
key: NoIfStatement
13 NoIfStatement ::= . AssignmentStatement Semicolon
14 NoIfStatement ::= . VariableDefinition Semicolon
15 NoIfStatement ::= . LBrace Statement_1 RBrace
16 NoIfStatement ::= . ConstantDefinition Semicolon
17 NoIfStatement ::= . Semicolon
key: AssignmentStatement
18 AssignmentStatement ::= . Identifier Equal Expression
key: Term
19 Term ::= . Factor MultiplyLike_Factor_0
key: ConstantDefinition
20 ConstantDefinition ::= . Const VariableDefinition
key: VariableDefinition
21 VariableDefinition ::= . Type Identifier__AssignmentStatement_0 Comma_Identifier__Comma_AssignmentStatement_0
key: Type
22 Type ::= . Int
23 Type ::= . Char
key: Factor
24 Factor ::= . Identifier
25 Factor ::= . Number
26 Factor ::= . Character
27 Factor ::= . LParen Expression RParen
key: AddLike
28 AddLike ::= . Plus
29 AddLike ::= . Minus
key: MultiplyLike
30 MultiplyLike ::= . Multiply
31 MultiplyLike ::= . Divide
32 MultiplyLike ::= . Modulo
key: Number
33 Number ::= . UnsignedNumber
34 Number ::= . Minus UnsignedNumber
35 Number ::= . Plus UnsignedNumber
key: Operator
36 Operator ::= . EqualTo
37 Operator ::= . NotEqualTo
38 Operator ::= . LessThan
39 Operator ::= . GreaterThan
40 Operator ::= . LessThanOrEqual
41 Operator ::= . GreaterThanOrEqual
key: LogicalOperator
42 LogicalOperator ::= . And
43 LogicalOperator ::= . Or
key: Statement_0
44 Statement_0 ::= .
45 Statement_0 ::= . Statement Statement_0
key: LogicalOperator_ConditionalExpression_0
46 LogicalOperator_ConditionalExpression_0 ::= .
47 LogicalOperator_ConditionalExpression_0 ::= . LogicalOperator ConditionalExpression LogicalOperator_ConditionalExpression_0
key: AddLike_Term_0
48 AddLike_Term_0 ::= .
49 AddLike_Term_0 ::= . AddLike Term AddLike_Term_0
key: Statement_1
50 Statement_1 ::= .
51 Statement_1 ::= . Statement Statement_1
key: MultiplyLike_Factor_0
52 MultiplyLike_Factor_0 ::= .
53 MultiplyLike_Factor_0 ::= . MultiplyLike Factor MultiplyLike_Factor_0
key: Identifier__AssignmentStatement_0
54 Identifier__AssignmentStatement_0 ::= . Identifier
55 Identifier__AssignmentStatement_0 ::= . Identifier Identifier__AssignmentStatement_0
56 Identifier__AssignmentStatement_0 ::= . AssignmentStatement
57 Identifier__AssignmentStatement_0 ::= . AssignmentStatement Identifier__AssignmentStatement_0
key: Comma_Identifier__Comma_AssignmentStatement_0
58 Comma_Identifier__Comma_AssignmentStatement_0 ::= .
59 Comma_Identifier__Comma_AssignmentStatement_0 ::= . Comma Identifier Comma_Identifier__Comma_AssignmentStatement_0
60 Comma_Identifier__Comma_AssignmentStatement_0 ::= . Comma AssignmentStatement Comma_Identifier__Comma_AssignmentStatement_0