Мне удалось деактивировать синтаксические ошибки, и я хочу кратко записать, как я это сделал:
1.) Написать класс, который расширяет CPreprocessor
и переопределяет handleProblem
.В моем случае моим ключевым словом является «@func», но оно обозначено как «@» и «func».'@' Помещается в список проблем, который обрабатывается в handleProblem
.
import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor;
...
public class GRASPPreprocessor extends CPreprocessor {
public GRASPPreprocessor(FileContent fileContent, IScannerInfo info, ParserLanguage language, IParserLogService log,
IScannerExtensionConfiguration configuration, IncludeFileContentProvider readerFactory) {
super(fileContent, info, language, log, configuration,
}
@Override
public void handleProblem(int id, char[] arg, int offset, int endOffset) {
if (new String(arg).equals("@")) {
this.problem = new ProblemStorage(id, arg, offset, endOffset);
} else {
super.handleProblem(id, arg, offset, endOffset);
}
}
}
Я создал короткий класс Storage для хранения аргументов.Но вызывайте метод handleProblem
суперкласса только в том случае, если за «@» не следует «func».Это делается в nextToken
:
@Override
public IToken nextToken() throws EndOfFileException {
IToken token = super.nextToken();
if(problem != null && token.getType() == IToken.tIDENTIFIER) {
if (new String(token.getCharImage()).equals("func")) {
problem = null;
return super.nextToken();
} else {
super.handleProblem(problem.id, problem.arg, problem.offset, problem.endOffset);
return token;
}
}
return token;
}
Это в основном игнорирует "@func".Блуждающая буква '@' все равно будет помечена как проблема.
2.) Определите свой собственный языковой класс, расширяя GPPLanguage и переопределяя createScanner
:
protected IScanner createScanner(FileContent content, IScannerInfo scanInfo, IncludeFileContentProvider fcp,
IParserLogService log) {
return new GRASPPreprocessor(content, scanInfo, getParserLanguage(), log,
getScannerExtensionConfiguration(scanInfo), fcp);
}
3.) Добавьте расширениек plugin.xml с точкой расширения org.eclipse.cdt.core.language
, а также сообщить плагину, какой тип контента должен использоваться для этого языка:
<extension
point="org.eclipse.core.contenttype.contentTypes">
<content-type
file-extensions="grasp"
id="de.blub.contenttype.grasp"
name="GRASP"
priority="high">
</content-type>
</extension>
<extension
point="org.eclipse.cdt.core.language">
<language
class="de.blub.language.GRASPLanguage"
id="de.blub.language.grasp"
name="Great Alternative Stupid Language">
<contentType
id="de.blub.contenttype.grasp">
</contentType>
</language>
4.) Я незнать, что не так с привязкой типа контента, но она не работает.Я спросил сообщество здесь об этом.Тем не менее, вы можете определить добавить свою собственную ассоциацию через Window-> Preferences-> General-> Content Types .