1
0
Files

83 lines
2.3 KiB
Java
Raw Permalink Normal View History

2023-08-20 12:13:40 +08:00
import org.antlr.v4.runtime.*;
/**
* The generic walker for collecting defines as a enum.
*/
public class DefinesWalker extends CKDefinesParserBaseListener {
2023-08-20 16:10:22 +08:00
public DefinesWalker(BufferedTokenStream tokenStream) {
mCommentsFinder = new CommentsFinder(tokenStream);
mResult = null;
2023-08-20 12:13:40 +08:00
2023-08-20 16:10:22 +08:00
mCurrentEnum = null;
mCurrentEntry = null;
}
public EnumsHelper.BEnum getEnum() {
2023-08-20 16:10:22 +08:00
return mResult;
}
private CommentsFinder mCommentsFinder;
private EnumsHelper.BEnum mResult;
2023-08-20 16:10:22 +08:00
private EnumsHelper.BEnum mCurrentEnum;
private EnumsHelper.BEnumEntry mCurrentEntry;
2023-08-20 16:10:22 +08:00
2023-08-20 12:13:40 +08:00
@Override
public void enterProg(CKDefinesParser.ProgContext ctx) {
mCurrentEnum = new EnumsHelper.BEnum();
2023-08-20 12:13:40 +08:00
}
@Override
public void exitProg(CKDefinesParser.ProgContext ctx) {
// update enum
mCurrentEnum.updateByEntries();
// and return
2023-08-20 16:10:22 +08:00
mResult = mCurrentEnum;
mCurrentEnum = null;
}
@Override
public void enterDefinePair(CKDefinesParser.DefinePairContext ctx) {
mCurrentEntry = new EnumsHelper.BEnumEntry();
2023-08-20 12:13:40 +08:00
}
@Override
public void exitDefinePair(CKDefinesParser.DefinePairContext ctx) {
2023-08-20 16:10:22 +08:00
// set values
mCurrentEntry.mEntryName = ctx.CKGENERIC_ID(0).getText();
2023-08-20 16:10:22 +08:00
mCurrentEntry.mEntryComment = mCommentsFinder.getComment(ctx.getStart(), ctx.getStop());
if (ctx.CKGENERIC_NUM() == null) {
2023-08-20 16:10:22 +08:00
// define with id
mCurrentEntry.mEntryValue = ctx.CKGENERIC_ID(1).getText();
// it refers other memeber, so its sign is unknown
mCurrentEntry.mEntrySignKind = EnumsHelper.BEnumEntrySignKind.Unknown;
// it refers other memeber, so it may flag.
mCurrentEntry.mEntryFlagKind = EnumsHelper.BEnumEntryFlagKind.MayFlag;
2023-08-20 16:10:22 +08:00
} else {
// define with number
String num = ctx.CKGENERIC_NUM().getText();
2023-08-20 16:10:22 +08:00
mCurrentEntry.mEntryValue = num;
// check the sign of this number
2023-08-20 16:10:22 +08:00
if (CommonHelper.isNegativeNumber(num)) {
mCurrentEntry.mEntrySignKind = EnumsHelper.BEnumEntrySignKind.Negative;
} else {
mCurrentEntry.mEntrySignKind = EnumsHelper.BEnumEntrySignKind.Positive;
2023-08-20 16:10:22 +08:00
}
// if the number is in hex form, it may belong to flag enum
2023-08-20 16:10:22 +08:00
if (CommonHelper.isHexNumber(num)) {
mCurrentEntry.mEntryFlagKind = EnumsHelper.BEnumEntryFlagKind.MayFlag;
} else {
mCurrentEntry.mEntryFlagKind = EnumsHelper.BEnumEntryFlagKind.NotFlag;
2023-08-20 16:10:22 +08:00
}
}
// add entry
mCurrentEnum.mEntries.add(mCurrentEntry);
mCurrentEntry = null;
2023-08-20 12:13:40 +08:00
}
}