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;
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-26 11:11:58 +08:00
|
|
|
public EnumsHelper.BEnum getEnum() {
|
2023-08-20 16:10:22 +08:00
|
|
|
return mResult;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private CommentsFinder mCommentsFinder;
|
2026-01-26 11:11:58 +08:00
|
|
|
private EnumsHelper.BEnum mResult;
|
2023-08-20 16:10:22 +08:00
|
|
|
|
2026-01-26 11:11:58 +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) {
|
2026-01-26 11:11:58 +08:00
|
|
|
mCurrentEnum = new EnumsHelper.BEnum();
|
2023-08-20 12:13:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void exitProg(CKDefinesParser.ProgContext ctx) {
|
2026-02-11 22:49:54 +08:00
|
|
|
// 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) {
|
2026-01-26 11:11:58 +08:00
|
|
|
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
|
2026-01-28 16:35:42 +08:00
|
|
|
mCurrentEntry.mEntryName = ctx.CKGENERIC_ID(0).getText();
|
2023-08-20 16:10:22 +08:00
|
|
|
mCurrentEntry.mEntryComment = mCommentsFinder.getComment(ctx.getStart(), ctx.getStop());
|
|
|
|
|
|
2026-01-28 16:35:42 +08:00
|
|
|
if (ctx.CKGENERIC_NUM() == null) {
|
2023-08-20 16:10:22 +08:00
|
|
|
// define with id
|
2026-01-28 16:35:42 +08:00
|
|
|
mCurrentEntry.mEntryValue = ctx.CKGENERIC_ID(1).getText();
|
2026-02-11 22:49:54 +08:00
|
|
|
// 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
|
2026-01-28 16:35:42 +08:00
|
|
|
String num = ctx.CKGENERIC_NUM().getText();
|
2023-08-20 16:10:22 +08:00
|
|
|
mCurrentEntry.mEntryValue = num;
|
|
|
|
|
|
2026-02-11 22:49:54 +08:00
|
|
|
// check the sign of this number
|
2023-08-20 16:10:22 +08:00
|
|
|
if (CommonHelper.isNegativeNumber(num)) {
|
2026-02-11 22:49:54 +08:00
|
|
|
mCurrentEntry.mEntrySignKind = EnumsHelper.BEnumEntrySignKind.Negative;
|
|
|
|
|
} else {
|
|
|
|
|
mCurrentEntry.mEntrySignKind = EnumsHelper.BEnumEntrySignKind.Positive;
|
2023-08-20 16:10:22 +08:00
|
|
|
}
|
2026-02-11 22:49:54 +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)) {
|
2026-02-11 22:49:54 +08:00
|
|
|
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
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|