Commit b06d4e8b authored by Johannes Roith's avatar Johannes Roith

- Newly patched original cup: has option to turn debug symbols off and handles...

- Newly patched original cup: has option to turn debug symbols off and handles them correctly for the special code blocks.
- Support special code block in our fork.
parent e3877096
......@@ -14,7 +14,10 @@
<target name="generate">
<jflex file="${jflex}/Lexer.jflex" destdir="${java}" />
<cup srcfile="${cup}/Parser.cup" destdir="${java}"
parser="Parser" interface="true" locations="true" />
parser="Parser"
interface="true"
locations="true"
debugsymbols="true" />
</target>
<path id="libraries"> <files includes="${lib}/java-cup-11b-runtime.jar" /> </path>
......
......@@ -180,10 +180,6 @@ action code {:
}
}
Stack<ComplexSymbol> head_tokens = new Stack<ComplexSymbol> ();
List<IProductionRightPart> rhs_accumulator = new ArrayList<IProductionRightPart>();
protected void ast_add_rhs_part(IProductionRightPart part)
......@@ -201,13 +197,9 @@ action code {:
rhs_accumulator.clear();
}
protected void ast_add_precedence(ComplexSymbol head, Object lst)
protected void ast_add_precedence(Object lst, Range range)
{
Precedence p = new Precedence(_cur_side, (List<Terminal>) lst,
new Range(Position.fromComplexSymbolLeft(head),
Position.fromComplexSymbolRight((ComplexSymbol) stack.peek()
)
));
Precedence p = new Precedence(_cur_side, (List<Terminal>) lst, range);
parserResult.precedences.add(p);
}
......@@ -376,39 +368,35 @@ import_list ::=
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
import_spec ::=
IMPORT {:
head_tokens.push((ComplexSymbol) stack.peek());
:}
IMPORT : import_token
import_id
{:
SEMI : semi {:
/* save this import on the imports list */
context.import_list.push(multipart_name);
Import imprt = new Import(
new Name (multipart_name, null), // TODO: from, to
new Range(Position.fromComplexSymbolLeft(head_tokens.pop()),
Position.fromComplexSymbolRight((ComplexSymbol) cur_token)));
new Range(Position.fromLocation(import_tokenxleft),
Position.fromLocation(semixright)));
parserResult.imports.add(imprt);
/* reset the accumulated multipart name */
multipart_name = new String();
:}
SEMI
;
class_name ::=
empty |
CLASS {:
head_tokens.push((ComplexSymbol) stack.peek());
:} ID:id SEMI
CLASS : cls ID:id SEMI : semi
{:
context.parser_class_name = id;
context.symbol_const_class_name = id + "Sym";
parserResult.className = new ClassName (
new Name(id, null), //jrTODO: positions
new Range(Position.fromComplexSymbolLeft(head_tokens.pop()),
Position.fromComplexSymbolRight((ComplexSymbol) stack.peek())));
new Name(id, new Range(Position.fromLocation(idxleft),
Position.fromLocation(idxright))),
new Range(Position.fromLocation(clsxleft),
Position.fromLocation(semixright)));
:}
;
......@@ -425,9 +413,7 @@ code_parts ::=
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
action_code_part ::=
ACTION {:
head_tokens.push((ComplexSymbol) stack.peek());
:} CODE CODE_STRING : user_code opt_semi
ACTION CODE CODE_STRING : user_code opt_semi
{:
if (context.action_code!=null)
errMan.Warning(ErrorSource.Parser,
......@@ -435,11 +421,14 @@ action_code_part ::=
Position.fromLocation(user_codexleft));
else { /* save the user included code string */
context.action_code = user_code;
int debug_id = get_new_debug_id();
parserResult.actionCode = new SpecialCodeBlock(
debug_id,
SpecialCodeBlock.BlockType.Action,
user_code,
new Range(Position.fromComplexSymbolLeft(head_tokens.pop()),
Position.fromComplexSymbolRight((ComplexSymbol) cur_token))); // jrTODO!
new Range(Position.fromLocation(user_codexleft),
Position.fromLocation(user_codexright)));
}
:}
;
......@@ -447,9 +436,7 @@ action_code_part ::=
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
parser_code_part ::=
PARSER {:
head_tokens.push((ComplexSymbol) stack.peek());
:} CODE CODE_STRING:user_code opt_semi
PARSER CODE CODE_STRING:user_code opt_semi
{:
if (context.parser_code!=null)
errMan.Warning(ErrorSource.Parser,
......@@ -457,11 +444,13 @@ parser_code_part ::=
Position.fromLocation(user_codexleft));
else { /* save the user included code string */
context.parser_code = user_code;
int debug_id = get_new_debug_id();
parserResult.parserCode = new SpecialCodeBlock(
debug_id,
SpecialCodeBlock.BlockType.Parser,
user_code,
new Range(Position.fromComplexSymbolLeft(head_tokens.pop()),
Position.fromComplexSymbolRight((ComplexSymbol) cur_token))); // jrTODO!
new Range(Position.fromLocation(user_codexleft),
Position.fromLocation(user_codexright)));
}
:}
;
......@@ -469,20 +458,20 @@ parser_code_part ::=
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
init_code ::=
INIT {:
head_tokens.push((ComplexSymbol) stack.peek());
:} WITH CODE_STRING:user_code opt_semi
INIT WITH CODE_STRING:user_code opt_semi
{:
if (context.init_code!=null)
errMan.Warning(ErrorSource.Parser, "Redundant init code (skipping)",
Position.fromLocation(user_codexleft));
else {/* save the user code */
context.init_code = user_code;
int debug_id = get_new_debug_id();
parserResult.initCode = new SpecialCodeBlock(
debug_id,
SpecialCodeBlock.BlockType.Init,
user_code,
new Range(Position.fromComplexSymbolLeft(head_tokens.pop()),
Position.fromComplexSymbolRight((ComplexSymbol) cur_token))); // jrTODO!
new Range(Position.fromLocation(user_codexleft),
Position.fromLocation(user_codexright)));
}
:}
;
......@@ -490,9 +479,7 @@ init_code ::=
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
scan_code ::=
SCAN {:
head_tokens.push((ComplexSymbol) stack.peek());
:} WITH CODE_STRING:user_code opt_semi
SCAN WITH CODE_STRING:user_code opt_semi
{:
if (context.scan_code!=null)
errMan.Warning(ErrorSource.Parser, "Redundant scan code (skipping)",
......@@ -500,11 +487,13 @@ scan_code ::=
else {
/* save the user code */
context.scan_code = user_code;
int debug_id = get_new_debug_id();
parserResult.scanCode = new SpecialCodeBlock(
debug_id,
SpecialCodeBlock.BlockType.Scan,
user_code,
new Range(Position.fromComplexSymbolLeft(head_tokens.pop()),
Position.fromComplexSymbolRight((ComplexSymbol) cur_token))); // jrTODO!
new Range(Position.fromLocation(user_codexleft),
Position.fromLocation(user_codexright)));
}
:}
......@@ -654,15 +643,13 @@ precedence_l ::= precedence_l preced | preced;
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
preced ::=
PRECEDENCE
{:
head_tokens.push((ComplexSymbol) stack.peek());
:}
PRECEDENCE : prec
preced_type
terminal_list:lst SEMI
terminal_list:lst SEMI : semi
{:
ComplexSymbol head = head_tokens.pop();
ast_add_precedence(head, lst);
ast_add_precedence(lst, new Range(
Position.fromLocation(precxleft),
Position.fromLocation(semixright)));
:}
;
......@@ -717,10 +704,8 @@ term_id ::= symbol_id:sym
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
start_spec ::=
START{:
head_tokens.push((ComplexSymbol) stack.peek());
:} WITH nt_id:start_name
{:
START : start WITH nt_id : start_name
SEMI : semi {:
/* verify that the name has been declared as a non terminal */
non_terminal nt = (non_terminal)non_terms.get(start_name);
if (nt == null)
......@@ -745,16 +730,14 @@ start_spec ::=
context.start_production = p;
new_rhs();
//jrTODO: position, start symbol?, side effects?
Range range = new Range(Position.fromComplexSymbolLeft(head_tokens.pop()),
Position.fromComplexSymbolRight((ComplexSymbol) stack.peek()));
Range range = new Range(Position.fromLocation(startxleft),
Position.fromLocation(semixright));
Range innerRange = new Range(Position.fromLocation(start_namexleft),
Position.fromLocation(start_namexright));
parserResult.startWith = new StartWith(new NonTerminal (new Name (start_name, innerRange), innerRange), range);
parserResult.startWith = new StartWith(new NonTerminal (
new Name (start_name, innerRange), innerRange), range);
}
:}
SEMI
|
empty
;
......
......@@ -49,7 +49,7 @@ public class GetDebuggerMappingVisitor extends Visitor<Object>
this.mappings = new ArrayList<Mapping>();
}
private void doCheck(ActionCodeBlock node) {
private void doCheck(CodeBlock node) {
if (node == null)
return;
......@@ -73,6 +73,6 @@ public class GetDebuggerMappingVisitor extends Visitor<Object>
@Override
public void postVisit (SpecialCodeBlock node, Object data) {
// doCheck(node);
doCheck(node);
}
}
......@@ -6,15 +6,9 @@ import de.in.tum.www2.cup.analysis.AbstractVisitor;
public class ActionCodeBlock extends CodeBlock
implements IProductionRightPart
{
private int debugId;
public int getDebugId() {
return debugId;
}
public ActionCodeBlock(int debugId, String blob, Range range) {
super(blob, range);
this.debugId = debugId;
super(debugId, blob, range);
}
@Override
......
......@@ -4,11 +4,20 @@ import de.in.tum.www2.cup.Range;
import de.in.tum.www2.cup.Position;
public abstract class CodeBlock extends AbstractNode {
private int debugId;
private String blob;
public int getDebugId() {
return debugId;
}
public String blob;
public CodeBlock(String blob, Range range) {
public String getBlob() {
return blob;
}
public CodeBlock(int debugId, String blob, Range range) {
super(range);
this.debugId = debugId;
this.blob = blob;
}
......
......@@ -19,8 +19,8 @@ public class SpecialCodeBlock extends CodeBlock
return bt;
}
public SpecialCodeBlock(BlockType bt, String blob, Range range) {
super(blob, range);
public SpecialCodeBlock(int debugId, BlockType bt, String blob, Range range) {
super(debugId, blob, range);
this.bt = bt;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment