(Eclipse)语法Highlighting Plugin,突出显示/验证入门的奇怪问题

时间:2017-09-20 13:17:09

标签: eclipse validation plugins syntax highlighting

我正在为我的公司制作一个突出显示插件的语法。我不是在创建一个新的编辑器,我正在使用一个使用Extensions进行通用编辑器的eclipse模板。

免责声明:由于版本问题,丢失文件等原因,我在使用XText在3台不同的机器上一致地工作时遇到了很多麻烦。所以这是不可能的

org.eclipse.ui.genericeditor.presentationReconcilers
org.eclipse.ui.genericeditor.contentTypes
org.eclipse.ui.genericeditor.hoverProviders
org.eclipse.ui.genericeditor.contentAssistProcessors
org.eclipse.ui.editors
org.eclipse.core.filebuffers.documentSetup

我正在使用我有一些奇怪的问题。在我开始之前:

  • 在帮助中检测到插件>关于Eclipse>安装细节>插件 其他示例插件使用与运行此插件相同的方法运行

问题:

  • 我在放置任何内容时收到以下错误消息 除<?xml version='1.0'>以外的文件:
      

    “Prolog中不允许使用内容”

  • 关键字似乎以蓝色突出显示。正如你在我看到的那样 源代码,应以红色突出显示。

    Click here 查看我的运行时Eclipe编辑器的样子 当我试图测试我的语法规则时。

以下是我的课程源代码。 我想知道:

  1. 为什么我的关键字在语法着色中被识别但是     上面带有“ prolog ”错误的无效命令
  2. 为什么上面的序言错误正在发生
  3. 为什么它不是根据我的规范或不同的规范来验证文件
  4. 指出我正确的方向
  5. 希望你能提供帮助。 谢谢:)。

    Reconciler Class:

    package myplugin;
    
    import org.eclipse.jface.text.IDocument;
    import org.eclipse.jface.text.presentation.PresentationReconciler;
    import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
    
    
    public class MyReconciler extends PresentationReconciler {
    
        public MyReconciler() {
            // TODO this is logic for .project file to color tags in blue. Replace with your language logic!
            MyScanner scanner = new MyScanner(new SyntaxColorProvider());
    
            DefaultDamagerRepairer dr= new DefaultDamagerRepairer(scanner);
            this.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
            this.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
        }
    }
    

    扫描仪课程:

    package myplugin;
    
    import java.util.ArrayList; 
    import java.util.List; 
    
    import org.eclipse.jface.text.TextAttribute; 
    import org.eclipse.jface.text.rules.BufferedRuleBasedScanner; 
    import org.eclipse.jface.text.rules.EndOfLineRule; 
    import org.eclipse.jface.text.rules.IRule; 
    import org.eclipse.jface.text.rules.IToken;
    import org.eclipse.jface.text.rules.IWordDetector;
    import org.eclipse.jface.text.rules.MultiLineRule;
    import org.eclipse.jface.text.rules.PatternRule; 
    import org.eclipse.jface.text.rules.SingleLineRule; 
    import org.eclipse.jface.text.rules.Token; 
    import org.eclipse.jface.text.rules.WhitespaceRule; 
    import org.eclipse.jface.text.rules.WordRule; 
    
    
    public class MyScanner extends BufferedRuleBasedScanner 
    { 
    
    private static String[] misc = {
         true",
        "false", 
        "unsigned",
        "jump",
        "read",     
        "write",
    };
    
    // Tokens
    private final IToken KEYWORD_TOKEN;
    
    private List<IRule> basicRules;
    
    public MyScanner(SyntaxColorProvider colorProvider)
    {
        super(5000);
    
        // CREATE TOKENS
        KEYWORD_TOKEN = new Token(new TextAttribute(colorProvider.getColor(SyntaxColorProvider.KEYWORD)));
    
        // CREATE RULES
        List rules = new ArrayList<IRule>();
    
    
        // Add rule for strings and character constants.
        rules.add(new SingleLineRule("\"", "\"", STRING_TOKEN, '\\'));
        rules.add(new SingleLineRule("'", "'", STRING_TOKEN, '\\'));
    
        // Add word rule for keywords, types, and constants.
        WordRule wordRule = new WordRule(new WordDetector(), OTHER_TOKEN);
    
        // Single-line comments
        rules.add(new EndOfLineRule("//", STRING_TOKEN));
    
        // Multi-line comments
        rules.add(new MultiLineRule("/$", "$/", COMMENT_TOKEN));
    
        // KEYWORDS
        for (String misc : misc)
        {
            wordRule.addWord(misc, KEYWORD_TOKEN);
        }
        rules.add(wordRule);
    
        IRule[] result= new IRule[rules.size()];
        rules.toArray(result);
        setRules(result);
    }
    

    }

    ValidatorDocumentSetupParticipant:

    package myplugin;
    
    import java.io.StringReader;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.eclipse.core.filebuffers.IDocumentSetupParticipant;
    import org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension;
    import org.eclipse.core.filebuffers.LocationKind;
    import org.eclipse.core.resources.IFile;
    import org.eclipse.core.resources.IMarker;
    import org.eclipse.core.resources.ResourcesPlugin;
    import org.eclipse.core.runtime.CoreException;
    import org.eclipse.core.runtime.IPath;
    import org.eclipse.jface.text.DocumentEvent;
    import org.eclipse.jface.text.IDocument;
    import org.eclipse.jface.text.IDocumentListener;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXParseException;
    
    public class ValidatorDocumentSetupParticipant implements IDocumentSetupParticipant, IDocumentSetupParticipantExtension {
    
        private final class DocumentValidator implements IDocumentListener {
            private final IFile file;
            private IMarker marker;
    
            private DocumentValidator(IFile file) {
                this.file = file;
            }
    
            @Override
            public void documentChanged(DocumentEvent event) {
                if (this.marker != null) {
                    try {
                        this.marker.delete();
                    } catch (CoreException e) {
                        e.printStackTrace();
                    }
                    this.marker = null;
                }
                try (StringReader reader = new StringReader(event.getDocument().get());) {
                    DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                    documentBuilder.parse(new InputSource(reader));
                } catch (Exception ex) {
                    try {
                        this.marker = file.createMarker(IMarker.PROBLEM);
                        this.marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
                        this.marker.setAttribute(IMarker.MESSAGE, ex.getMessage());
                        if (ex instanceof SAXParseException) {
                            SAXParseException saxParseException = (SAXParseException)ex;
                            int lineNumber = saxParseException.getLineNumber();
                            int offset = event.getDocument().getLineInformation(lineNumber - 1).getOffset() + saxParseException.getColumnNumber() - 1;
                            this.marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
                            this.marker.setAttribute(IMarker.CHAR_START, offset);
                            this.marker.setAttribute(IMarker.CHAR_END, offset + 1);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
    
            @Override
            public void documentAboutToBeChanged(DocumentEvent event) {
            }
        }
    
        @Override
        public void setup(IDocument document) {
        }
    
        @Override
        public void setup(IDocument document, IPath location, LocationKind locationKind) {
            if (locationKind == LocationKind.IFILE) {
                IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(location);
                document.addDocumentListener(new DocumentValidator(file));
            }
    

    WordDetector类:

     package myplugin;
    
    import org.eclipse.jface.text.rules.IWordDetector; 
    
    public class WordDetector implements IWordDetector 
    {    
        public boolean isWordPart(char character) {
            return Character.isJavaIdentifierPart(character);
        }
    
        public boolean isWordStart(char character) {
            return Character.isJavaIdentifierStart(character);
        }
    }
    

    SyntaxColorProvider类:

    package myplugin;
    
    import java.util.HashMap; 
    
    public class SyntaxColorProvider 
    { 
    
    public static final RGB RED = new RGB(200, 0, 0); 
    
    public static final RGB GREEN = new RGB(0, 200, 0); 
    
    public static final RGB BLUE = new RGB(0, 0, 200); 
    
    public static final RGB COMMENT = new RGB(128, 128, 128);  
    
    public static final RGB KEYWORD = new RGB(255, 0, 0); 
    
    public static final RGB TYPE = new RGB(0, 0, 128); 
    
    public static final RGB STRING = new RGB(0, 128, 0); 
    
    public static final RGB DEFAULT = new RGB(0, 0, 0); 
    
    
    protected Map fColorTable = new HashMap(10); 
    
    /**
     * Release all of the color resources held onto by the receiver. 
     */ 
    public void dispose() 
    { 
        Iterator e = fColorTable.values().iterator(); 
        while (e.hasNext()) 
            ((Color) e.next()).dispose(); 
    } 
    
    /**
     * Return the Color that is stored in the Color table as rgb. 
     */ 
    public Color getColor(RGB rgb) 
    { 
        Color color = (Color) fColorTable.get(rgb); 
        if (color == null) 
        { 
            color = new Color(Display.getCurrent(), rgb); 
            fColorTable.put(rgb, color); 
        } 
        return color; 
    }
    

2 个答案:

答案 0 :(得分:2)

这看起来像示例编辑器,但有一些更改-和

documentBuilder.parse(new InputSource(reader));

也许会解析XML。它检测到不正确的XML,因为缺少序言。从代码中删除该行,或实施类似的标记和标记问题的操作。

答案 1 :(得分:0)

好的,所以我一直在努力解决这个问题的问题就在这一行:documentBuilder.parse(new InputSource(reader));,我正在尝试自己找出一个文本解析器。

相关问题