Skip to content

Commit

Permalink
Fixed:the bug in innner-state extension.Again...
Browse files Browse the repository at this point in the history
  • Loading branch information
Kherrisan committed Jan 15, 2018
1 parent d1c406a commit d8898d3
Show file tree
Hide file tree
Showing 6 changed files with 318 additions and 251 deletions.
441 changes: 207 additions & 234 deletions .idea/workspace.xml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion ANSI_C.yacc
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ declaration

declaration_specifiers
: storage_class_specifier
| storage_class_specifier declaration_specifiers
| storage_classRBRACE_specifier declaration_specifiers
| type_specifier
| type_specifier declaration_specifiers
| type_qualifier
Expand Down
2 changes: 1 addition & 1 deletion src/main/com/seu/dokyme/dokymeyacc/DokymeYaccFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ public DokymeYaccFile() {
}

public Production addRealStartSymbol() {
realStart = new Symbol("%START");
realStart = new Symbol("START_");
Production startProduction = new Production();
startProduction.left = realStart;
startProduction.rights.add(start);
Expand Down
7 changes: 4 additions & 3 deletions src/main/com/seu/dokyme/dokymeyacc/LR1State.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,16 +78,16 @@ public LR1State shift(Symbol shiftSymbol, DokymeYaccFile yaccFile) {
public boolean addLR1Item(LR1Item item) {
for (LR1Item existed : items) {
if (existed.productionEquals(item)) {
existed.predicts.addAll(item.predicts);
return false;
//在该状态已有的item找到了产生式相同的item。
return existed.predicts.addAll(item.predicts);
}
}
items.add(item);
return true;
}

/**
* 迭代的做状态内扩展,知道该状态无法继续扩展
* 迭代的做状态内扩展,直到该状态无法继续扩展
*
* @param yaccFile
*/
Expand All @@ -96,6 +96,7 @@ public void closure(DokymeYaccFile yaccFile) {
while (changed) {
changed = false;
for (int i = 0; i < items.size(); i++) {
//对每一个item,判断dot之后是不是非终结符,如果是的话,就把那个非终结符为右部的产生式加入到该状态中,预测符为first(BetaA)。
LR1Item item = items.get(i);
for (LR1Item newItem : item.inStateExtension(yaccFile)) {
if (addLR1Item(newItem)) {
Expand Down
2 changes: 1 addition & 1 deletion template.txt
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ public class Parser {
return null;
}
int lp = line.indexOf('(');
int rp = line.indexOf(')');
int rp = line.lastIndexOf(')');
if (lp == -1 || rp == -1 || (!line.contains(TOKEN_SPLITER))) {
throw new Exception("Token file wrong format!");
}
Expand Down
115 changes: 104 additions & 11 deletions testcase/rules_arithmetic.dokycc
Original file line number Diff line number Diff line change
@@ -1,34 +1,127 @@
ID
CONSTANT
ASN

ADD
SUB
MUL
DIV
MOD

ASN
ADDA
SUBA
MULA
DIVA
MODA

INC
DEC

SEMI

IF
WHILE

LBRACE
RBRACE
LPARE
RPARE

OR
AND
NOT
EQU
NEQ
BTHAN
STHAN

INT
BYTE
CHAR
STRING
BOOLEAN
%%
statement_list
%%

%%
unary_expression:ID
unary_expression:CONSTANT

multplicative_expression:unary_expression
multplicative_expression:multplicative_expression MUL unary_expression
multplicative_expression:multplicative_expression DIV unary_expression
statement_list:statement
statement_list:statement_list statement

statement:expression_statement
statement:iteration_statement
statement:selection_statement
statement:compound_statement

expression_statement:expression SEMI
expression_statement:SEMI

expression:assignment_expression

assignment_expression:conditional_expression
assignment_expression:unary_expression assignment_operator assignment_expression

assignment_operator:ASN
assignment_operator:ADDA
assignment_operator:SUBA
assignment_operator:MULA
assignment_operator:DIVA
assignment_operator:MODA

conditional_expression:logical_and_expression
conditional_expression:logical_or_expression OR logical_and_expression

logical_and_expression:equality_expression
logical_and_expression:logical_and_expression AND equality_expression

equality_expression:relational_expression
equality_expression:equality_expression EQU relational_expression
equality_expression:equality_expression NEQ relational_expression

relational_expression:additive_expression
relational_expression:relational_expression STHAN additive_expression
relational_expression:relational_expression BTHAN additive_expression

additive_expression:multplicative_expression
additive_expression:additive_expression ADD multplicative_expression
additive_expression:additive_expression SUB multplicative_expression

assignment_expression:additive_expression
assignment_expression:unary_expression ASN assignment_expression
multplicative_expression:unary_expression
multplicative_expression:multplicative_expression MUL unary_expression
multplicative_expression:multplicative_expression DIV unary_expression
multplicative_expression:multplicative_expression MOD unary_expression

unary_expression:primary_expression
unary_expression:INC unary_expression
unary_expression:DEC unary_expression
unary_expression:unary_operator unary_expression

statement:assignment_expression SEMI
primary_expression:ID
primary_expression:CONSTANT
primary_expression:LPARE expression RPARE

statement_list:statement
statement_list:statement_list statement
unary_operator:NOT

iteration_statement:WHILE LPARE expression RPARE statement

selection_statement:IF LPARE expression RPARE statement

compound_statement:LBRACE RBRACE
compound_statement:LBRACE statement_list RBRACE
compound_statement:LBRACE declaration_list RBRACE
compound_statement:LBRACE declaration_list statement_list RBRACE

declaration:type_specifier ID SEMI

type_specifier:INT
type_specifier:BYTE
type_specifier:CHAR
type_specifier:STRING
type_specifier:BOOLEAN

declaration_list:declaration
declaration_list:declaration_list declaration

%%
public static void main(String[] args) {
Expand Down

0 comments on commit d8898d3

Please sign in to comment.