it-swarm.com.de

Wie kann ich einen benutzerdefinierten Eclipse-Syntax-Highlighter erstellen?

Ich habe einen Compiler für eine neue Sprache entwickelt. Ich dachte, es wäre schön, wenn man seine Entwicklung in einer syntaxbewussten Umgebung demonstrieren könnte. Die Sprache hat einige benutzerdefinierte Schlüsselwörter und ihre Struktur unterscheidet sich erheblich von gängigen Sprachen wie Java oder C/C++.

Wie kann ich einen benutzerdefinierten Syntax-Highligher für Eclipse entwickeln? Ich habe einige Verweise auf ein paar Plugins gesehen, aber die Dokumentation ist nicht gründlich genug für die Bedürfnisse meiner Anfänger.

Ich habe eine Grammatik/REs für meine Sprache sowie eine Liste relevanter Schlüsselwörter.

35

Das Eclipse-Framework verwendet ein ziemlich komplexes Dokumentmodell, um Syntaxfärbungen vorzunehmen (sie nennen es Färben, nicht Hervorheben). Es ist nicht so einfach wie in anderen Editoren. 

Wenn Sie wirklich etwas damit anfangen wollen, sollten Sie die folgenden Informationen aus dem Eclipse-Plug-in-Entwicklerhandbuch lesen .

(Der obige Link ist jetzt tot. Dies kann ein ähnliches Dokument sein oder this .)

14
Uri

Klingt, als ob Sie mit einer DSL (Domain Specific Language) zu tun haben. Was Sie suchen, klingt genau wie XText . Hier ist ein Auszug aus der Seite:

Xtext ist ein Framework/Tool zur Entwicklung externer textueller DSLs. Beschreiben Sie einfach Ihr eigenes DSL mit der einfachen EBNF-Grammatiksprache von Xtext, und der Generator erstellt daraus einen Parser, ein AST-Metamodell (in EMF implementiert) sowie einen voll ausgestatteten Eclipse-Texteditor. 

Check out dieses Video das ist ein Interview mit einer der Personen, die dahinter stehen. Ich bin sicher, dass Sie es von hier aus nehmen werden :-)

Sie können auch dieses Plugin auschecken. Nicht genau das, wonach Sie suchen, könnte aber ein schöner Start sein.

31
zvikico

Dies ist genau eines der Ziele von LiClipse ( http://www.liclipse.com/ ): leicht einen Editor mit Syntaxhervorhebung, grundlegender Code-Vervollständigung, Gliederung usw. für Eclipse - beachten Sie das Sein Kern (der das Erstellen benutzerdefinierter Sprachen ermöglicht) wurde vor kurzem zu Open Source: http://liclipse.blogspot.com.br/2016/05/liclipse-303-providing-back-to-open.html .

Es sind keine Java-Kenntnisse erforderlich, um eine neue Sprache hinzuzufügen (meistens wird eine neue .liclipse -Datei erstellt, die eine YAML-Datei ist), und es werden einige grundlegende Regeln für die Partitionierung der Sprache erstellt. Dies bedeutet, dass in der Regel nur Code getrennt wird von Kommentaren aus Strings - und die Angabe der Schlüsselwörter, die Sie in der Partition haben, würde bereits die Syntax hervorheben.

Wenn Sie es herunterladen, gibt es eine Reihe von Beispielen unter plugins\com.brainwy.liclipse.editor\languages ​​und einige grundlegende Dokumentationen finden Sie unter http://www.liclipse.com/text/supported_languages.html und http://www.liclipse.com/text/scope_definition.html wie das geht.

4
Fabio Zadrozny

Sie können stattdessen die benutzerdefinierte Sprache von Notepad ++ verwenden. Normalerweise verwenden wir Notepad ++ für einen solchen Anwendungsfall. Darin handelt es sich lediglich um ein XML. Notepad ++ bietet auch eine UI-basierte Bearbeitung zum Definieren Ihrer sprachspezifischen Grammatik.

1
srsforj

Ich habe gerade ausprobiertEclipse Colorerund es ist wirklich schön (z. B. zum Hervorheben, Arbeiten mit VBA-Dateien (in einem eingeschränkten Kontext natürlich), die sonst nicht unterstützt werden).

es unterstützt z.

  • falten (wie du siehst)
  • es unterstützt die Anpassung der Klammern (Öffnen/Schließen)
  • 200 + Dateierweiterungen (siehe unten)

 editor of some *.cls and *.bas file

 preferences - file types

mehr Screenshots auf ihrer Website

hier ist eine vollständige Liste der unterstützten Erweiterungen:

Es ist schwierig, diese Informationen zu erhalten, da sie nicht indexiert oder irgendwo im Web veröffentlicht werden, sondern jetzt auch von Google und Co gefunden werden sollten.
Ich habe alle Zeilen mit diesem Regex ^\s+<(?!(!--|prototype|filename)).+>$ entfernt, um den Inhalt der vollständigen und einer Kopie der Eclipse\plugins\net.sf.colorer_0.9.9\colorer\hrc\proto.hrc -Datei zu verdichten.
Aktualisierungen können jederzeit aktualisiert werden)

  <!--  main languages  -->
  <prototype name="c" group="main" description="C">

    <filename>/\.c$/i</filename>

  <prototype name="cpp" group="main" description="C++">

    <filename>/\.(cpp|cxx|cc|hpp|h)$/i</filename>

  <prototype name="d" group="main" description="D">

    <filename>/\.(d|di)$/i</filename>


  <prototype name="asm" group="main" description="ASM">

    <filename>/\.(mac|asm|inc|i32|cod)$/i</filename>

  <prototype name="Perl" group="main" description="Perl">

    <filename>/\.(pl[sx]?|pm|pod|t)$/i</filename>

  <prototype name="Java" group="main" description="Java">

    <filename>/\.(Java|jav|jad)$/i</filename>

  <prototype name="idl" group="main" description="IDL">

    <filename>/\.(hvs|(i|o)dl)$/i</filename>

  <prototype name="Pascal" group="main" description="Pascal">

    <filename>/\.(\~?pas|dpr|dpk|inc|int|pp)$/i</filename>

  <prototype name="csharp" group="main" description="C#">

    <filename>/\.cs$/i</filename>

  <prototype name="jsnet" group="main" description="JS.NET">

    <filename weight="0.5">/\.js$/i</filename>

  <prototype name="vbnet" group="main" description="VB.NET">

    <filename>/\.vb$/i</filename>

  <!-- warning!! extensions conflict with Fortran -->
  <prototype name="forth" group="main" description="Forth">

    <filename>/\.(fth|f32|f|spf)$/i</filename>

  <prototype name="fortran" group="main" description="Fortran">

    <filename>/\.(for|f(90)?)$/i</filename>

  <prototype name="vbasic" group="main" description="Visual Basic">

    <filename>/\.(bas|vbp|frm|cls)$/i</filename>

  <prototype name="python" group="main" description="Python">

    <filename>/\.(py|pyw|pys)$/i</filename>

  <prototype name="lua" group="main" description="Lua">

    <filename>/\.(lua)$/i</filename>
  </prototype>  
  <prototype name="Ruby" group="main" description="Ruby">

    <filename>/\.(rb|rbw|Ruby|rake)$/i</filename>
    <filename>/Rakefile$/i</filename>

  <prototype name="scala" group="main" description="Scala">

    <filename>/\.(scala)$/i</filename>

  <prototype name="tcltk" group="main" description="Tcl/Tk/Expect">

    <filename>/\.(tcl|tk|exp)$/i</filename>


  <!--  inet languages  -->

  <prototype name="html" group="inet" description="html">

    <filename>/\.[^ptr]??html?$/i</filename>


  <prototype name="css" group="inet" description="css">

    <filename>/\.(css)$/i</filename>

  <prototype name="html-css" group="inet" description="css for html">

    <filename weight="0">/\.(css)$/i</filename>

  <prototype name="svg-css" group="inet" description="css for svg">

    <filename weight="0">/\.(css)$/i</filename>

  <prototype name="sass" group="inet" description="SASS">

    <filename>/\.(sass)$/i</filename>


  <prototype name="haml" group="inet" description="HAML">

    <filename>/\.(haml)$/i</filename>

  <prototype name="erb" group="inet" description="ERB">

    <filename weight='4'>/\.(erb|rhtml|html\.erb)$/i</filename>


  <prototype name="jsp" group="inet" description="jsp">

    <filename>/\.(jspf?|tag)$/i</filename>


  <prototype name="php" group="inet" description="php">

    <filename>/\.(php\d?|phtml|thtml|inc)$/i</filename>


  <prototype name="xhtml-trans" group="inet" description="xhtml transitional" targetNamespace="http://www.w3.org/1999/xhtml">

    <filename>/\.html?/ix</filename>
    <filename>/\.xhtml?/ix</filename>

  <prototype name="xhtml-strict" group="inet" description="xhtml strict" targetNamespace="http://www.w3.org/1999/xhtml">

    <filename>/\.html?/ix</filename>
    <filename>/\.xhtml?/ix</filename>

  <prototype name="xhtml-frameset" group="inet" description="xhtml frameset" targetNamespace="http://www.w3.org/1999/xhtml">

    <filename>/\.html?/ix</filename>
    <filename>/\.xhtml?/ix</filename>

  <prototype name="asp.vb" group="inet" description="asp - VBScript">

    <filename>/\.(as(p|a)|ht(r|x|a)|inc)$/i</filename>

  <prototype name="asp.js" group="inet" description="asp - JavaScript">

    <filename>/\.(as(p|a)|ht(r|x|a)|inc)$/i</filename>

  <prototype name="asp.ps" group="inet" description="asp - PerlScript">

    <filename>/\.(as(p|a)|ht(r|x|a)|inc)$/i</filename>

  <prototype name="adp" group="inet" description="AOLserver Dynamic Pages">

    <filename>/\.(adp)$/i</filename>

  <prototype name="svg" group="inet" description="SVG 1.0" targetNamespace="http://www.w3.org/2000/svg">

    <filename>/\.svg/ix</filename>

  <prototype name="coldfusion" group="inet" description="ColdFusion">

    <filename>/\.(cfm|cfc)$/i</filename>

  <prototype name="jScript" group="inet" description="JavaScript">

    <filename>/\.(js|mocha)$/i</filename>

  <prototype name="actionscript" group="inet" description="ActionScript">

    <filename>/\.(as)$/i</filename>

  <prototype name="vbScript" group="inet" description="VBScript">

    <filename>/\.(vbs)$/i</filename>


  <prototype name="rss" group="inet" description="rss" targetNamespace="http://purl.org/rss/1.0/">

    <filename>/\.(rss)$/i</filename>
    <filename weight='1.5'>/^rss/i</filename>

  <prototype name="htc" group="inet" description="HTC">

    <filename weight='3'>/\.(htc)$/i</filename>

  <prototype name="xbl" group="inet" description="Mozilla XBL" targetNamespace="http://www.mozilla.org/xbl">

    <filename weight='0.5'>/\.(xml)/i</filename>

  <prototype name="wml" group="inet" description="wml" targetNamespace="http://www.wapforum.org/2001/wml">

    <filename>/\.wml$/i</filename>



  <!--  xml types  -->
  <prototype name="xml" group="xml" description="xml">

    <filename>/\.(xml|gi2|gpr|ui)$/i</filename>
    <filename>/\.(wxs|fb2)$/i</filename>



  <prototype name="dtd" group="xml" description="dtd">

    <filename>/\.(dtd|ent|mod)$/i</filename>

  <prototype name="dtdcatalog" group="xml" description="dtd/sgml catalog">

    <filename>/\.(cat|soc)$/i</filename>


  <prototype name="xslt" group="xml" description="xslt 1.0" targetNamespace="http://www.w3.org/1999/XSL/Transform">

    <filename>/\.(xslt?)$/i</filename>


  <prototype name="xslt2" group="xml" description="xslt 2.0" targetNamespace="http://www.w3.org/1999/XSL/Transform">

    <filename>/\.(xslt?2?)$/i</filename>

  <prototype name="xquery" group="xml" description="xquery 1.0">

    <filename>/\.(xq)$/i</filename>

  <prototype name="xslfo" group="xml" description="xslfo 1.0" targetNamespace="http://www.w3.org/1999/XSL/Transform">

    <filename>/\.(xslfo?|fo)$/i</filename>


  <prototype name="xmlschema" group="xml" description="XML Schema" targetNamespace="http://www.w3.org/2001/XMLSchema">

    <filename>/\.(xsd?)$/i</filename>


  <prototype name="relaxng" group="xml" description="Relax NG" targetNamespace="http://relaxng.org/ns/structure/1.0">

    <filename>/\.rng/ix</filename>

  <prototype name="schematron" group="xml" description="schematron" targetNamespace="http://www.ascc.net/xml/schematron">

    <filename>/\.sch$/ix</filename>

  <prototype name="wsdl" group="xml" description="wsdl 1.1" targetNamespace="http://schemas.xmlsoap.org/wsdl/">

    <filename>/\.wsdl$/ix</filename>

  <prototype name="rdf" group="xml" description="RDF" targetNamespace="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

    <filename>/\.rdf$/ix</filename>



  <prototype name="xmlcatalog" group="xml" description="XML Catalog" targetNamespace="urn:oasis:names:tc:entity:xmlns:xml:catalog">

    <filename>/\.xml$/ix</filename>

  </prototype>  
  <prototype name="docbook" group="xml" description="DocBook 4.2">

    <filename>/\.(dbk?|docbook)$/i</filename>

  <prototype name="mathml" group="xml" description="MathML2">

    <filename>/\.(math?|mml)$/i</filename>



  <!--  database languages  -->
  <prototype name="clarion" group="database" description="Clarion">

    <filename>/\.(cla|clw)$/i</filename>

  <!-- warning!! extensions conflict with Clipper -->
  <prototype name="Clipper" group="database" description="Clipper">

    <filename>/\.(ch|prg)$/i</filename>

  <prototype name="foxpro" group="database" description="FoxPro">

    <filename>/\.(prg|spr|mpr)$/i</filename>

  <prototype name="sqlj" group="database" description="SQLJ (Java sql)">

    <filename>/\.sqlj$/i</filename>

  <prototype name="paradox" group="database" description="Paradox">

    <filename>/\.sc$/i</filename>

  <prototype name="sql" group="database" description="SQL, PL/SQL">

    <filename>/\.sql$/i</filename>

  <prototype name="mysql" group="database" description="MySQL">

   <filename>/\.sql$/i</filename>


  <prototype name="Batch" group="scripts" description="Batch/Config.sys/NTcmd">

    <filename>/\.(Cmd|Bat|nt|btm|sys)$/i</filename>

  <prototype name="Apache" group="scripts" description="Apache httpd.conf">

    <filename>/(httpd\.conf|srm\.conf|access\.conf|\.htaccess|Apache\.conf)$/i</filename>

  <prototype name="Shell" group="scripts" description="sh/ksh/bash script">

    <filename>/\.(sh|spec)$|^\./i</filename>
    <filename>/^PKGBUILD$/i</filename>

  <prototype name="avisynth" group="scripts" description="AviSynth">

    <filename>/\.(avs|avsi)$/i</filename>

  <prototype name="config" group="scripts" description="Config, INI and CTL">

    <filename>/\.(ctl|tpl|ini|cfg|inf|srg|conf|types|tab|dof|dsk|lng)$/i</filename>

  <prototype name="awk" group="scripts" description="AWK">

    <filename weight='5'>/\.awk$/i</filename>


  <prototype name="makefile" group="scripts" description="makefile">

    <filename>/(makefile | tools\.ini) | \.(mak|gmk|ds(p|w)|bp(k|r|g)$)/ix</filename>
    <filename weight='3'>/(Android|application)\.mk/i</filename>

  <prototype name="qmake" group="scripts" description="Qt qmake">

    <filename>/\.pr[oif]$/i</filename>


  <prototype name="mkb" group="scripts" description="Project build file for Airplay SDK">
    <filename>/\.(mkb|mkf)$/i</filename>

  <prototype name="ant" group="scripts" description="Ant's build.xml" targetNamespace="http://jakarta.Apache.org/ant/">

    <filename weight='4'>/\bbuild\.xml$/ix</filename>


  <prototype name="acapella" group="scripts" description="Acapella">

    <filename>/\.(script|proc|param|parameter)$/i</filename>


  <prototype name="qrc" group="scripts" description="qrc">

    <filename>/\.qrc$/ix</filename>


 <prototype name="m4" group="scripts" description="M4">

    <filename>/\.m4$/i</filename>

  <prototype name="linkdef" group="scripts" description="Link Defines">

    <filename weight='3'>/\.def$/i</filename>

  <prototype name="resources" group="scripts" description="Resources">

    <filename>/\.(rc|dlg)$/i</filename>


  <prototype name="javacc" group="scripts" description="Java Compiler Compiler">

    <filename>/\.(jjt?)$/i</filename>

  <prototype name="javaProperties" group="scripts" description="Java properties">

    <filename>/\.pro(p(erties)?)?$/i</filename>

  <prototype name="javapolicy" group="scripts" description="Java policy">

    <filename>/\.policy$/i</filename>

  <prototype name="asn1" group="scripts" description="ASN.1/ECN">

    <filename>/\.(asn|asn1|ecn|edm|Elm|mib)$/i</filename>
    <filename>/-mib$/i</filename>

  <prototype name="Lex" group="scripts" description="Lex">

    <filename>/\.(l|f?lex)+$/i</filename>

  <prototype name="yacc" group="scripts" description="YACC">

    <filename>/\.y+$/i</filename>



  <prototype name="delphiform" group="scripts" description="Delphi form">

    <filename>/\.dfm$/i</filename>

  <prototype name="pnuts" group="scripts" description="Java: Pnuts">

    <filename>/\.(pnut)$/i</filename>


    <prototype name="scons" group="scripts" description="SCons">

    <filename>/(SConstruct|SConscript)$/i</filename>

  <prototype name="rtf" group="scripts" description="RTF text">

    <filename>/\.rtf$/i</filename>

  <prototype name="TeX" group="scripts" description="TeX">

    <filename>/\.(tex|cls|sty|ltx|ltr|dtx)$/i</filename>

  <prototype name="graphviz" group="scripts" description="GraphViz dot">

    <filename>/\.dot+$/i</filename>

  <prototype name="dcl" group="scripts" description="OpenVMS DCL">

    <filename>/\.com$/i</filename>

  <prototype name="vrml" group="scripts" description="VRML">

    <filename>/\.wrl$/i</filename>


  <prototype name="wsc" group="scripts" description="wsc" targetNamespace="uri:wsc">
    <!-- NOTE! 'targetNamespace' is fictive, used only for xsd2hrc -->

    <filename>/\.wsc$/i</filename>

  <prototype name="wsf" group="scripts" description="wsf">

    <filename>/\.wsf$/i</filename>



  <prototype name="rarscript" group="scripts.install" description="RAR Install Script">

    <filename>/\.s$/i</filename>

  <prototype name="nsi" group="scripts.install" description="Nullsoft Install Script">

    <filename>/\.ns(i|h)$/i</filename>

  <prototype name="iss" group="scripts.install" description="InnoSetup script">

    <filename>/\.iss$/i</filename>

  <prototype name="isScripts" group="scripts.install" description="IS script">

    <filename>/\.rul$/i</filename>


  <!--  rare languages  -->

  <prototype name="c1c" group="rare" description="1C">

    <filename>/\.1c$/i</filename>

  <prototype name="ada" group="rare" description="Ada">

    <filename>/\.(ads|adb|adc)$/i</filename>

  <prototype name="abap4" group="rare" description="ABAP/4">

    <filename>/\.(abap4|abap)$/i</filename>

  <prototype name="AutoIt" group="rare" description="AutoIt 2.x">

    <filename>/\.aut$/i</filename>


  <!--  !! you may wish to swap next two types
  because of collision with extensions  -->
  <prototype name="dssp" group="rare" description="Dssp">

    <filename>/\.dsp$/i</filename>

  <prototype name="adsp" group="rare" description="ADSP-21xx Asm">

    <filename>/\.(dsp|sys)$/i</filename>

  <prototype name="Baan" group="rare" description="Baan">

    <filename>/\.cln$/i</filename>

  <prototype name="cobol" group="rare" description="Cobol Fixed format">

    <filename>/\.(cob|cbl)$/i</filename>

  <prototype name="cobolfr" group="rare" description="Cobol Free format">

    <filename>/\.(cob|cbl)$/i</filename>

  <prototype name="cache" group="rare" description="Cache/Open-M">

    <filename>/\.(rsa|ro|rtn|inc|int|mac|cdl)$/i</filename>

  <prototype name="cup" group="rare" description="CUP">

    <filename>/\.(cup)$/i</filename>

  <prototype name="eiffel" group="rare" description="Eiffel">

    <filename>/\.e$/i</filename>

  <prototype name="erlang" group="rare" description="Erlang">

    <filename>/\.[eh]rl$/i</filename>

  <prototype name="icon" group="rare" description="Icon">

    <filename>/\.icn$/i</filename>

  <prototype name="LISP" group="rare" description="LISP">

    <filename>/\.(lsp|LISP|scm|elc|el)$/i</filename>

  <prototype name="mako" group="rare" description="Mako templates">

    <!-- extension conflicts with Makefile, hence weight is less than 2 -->
    <filename weight="1.5">/\.(mako|mak)$/i</filename>

  <prototype name="matlab" group="rare" description="MatLab">

    <filename>/\.m$/i</filename>

  <!-- warning!! extensions conflict with link defines -->
  <prototype name="modula2" group="rare" description="Modula2 and Oberon2">

    <filename>/\.(mod|ob2|odf|def)$/i</filename>

  <prototype name="nesc" group="rare" description="nesC">

    <filename>/\.nc$/i</filename>

  <prototype name="picasm" group="rare" description="PicAsm">

    <filename>/\.(asm|pic)$/i</filename>

  <prototype name="pl1" group="rare" description="PL1">

    <filename>/\.(pl1|pli)$/i</filename>

  <prototype name="rexx" group="rare" description="Rexx">

    <filename>/\.(rex|cmd)$/i</filename>

 <prototype name="jcl" group="rare" description="JCL">

    <filename>/\.(jcl)$/i</filename>


  <prototype name="sml" group="rare" description="Standard ML">

    <filename>/\.(sml|sig)$/i</filename>

  <prototype name="ocaml" group="rare" description="OCaml">

    <filename>/\.ml[ilpy]?$/i</filename>

  <prototype name="sicstusProlog" group="rare" description="Sicstus Prolog">

    <filename>/\.pl$/i</filename>

  <prototype name="stata" group="rare" description="STATA">

    <filename>/\.a?do$/i</filename>

  <prototype name="turboProlog" group="rare" description="Turbo Prolog">

    <filename>/\.tpl$/i</filename>

  <prototype name="verilog" group="rare" description="Verilog HDL">

    <filename weight='3'>/\.g?v$/i</filename>

  <prototype name="vhdl" group="rare" description="VHDL">

    <filename>/\.vhdl?$/i</filename>

 <prototype name="ahdl" group="rare" description="AHDL">

   <filename>/\.(tdf|tdo|ahdl)$/i</filename>

  <prototype name="z80" group="rare" description="z80asm">

    <filename>/\.za$/i</filename>

  <prototype name="asm80" group="rare" description="asm80">

    <filename>/\.a80$/i</filename>

  <prototype name="a51" group="rare" description="8051 asm">

    <filename>/\.a5(1|2)$/i</filename>

  <prototype name="avr" group="rare" description="AVR asm">

    <filename>/\.(asm|inc|avr)$/i</filename>

  <prototype name="mason" group="rare" description="mason">

    <filename>/\.(mc)$/i</filename>

  <prototype name="postscript" group="rare" description="PostScript">

    <filename>/\.((e)?ps|pfa|gsf)$/i</filename>

  <!-- flex extension conflicts -->
  <prototype name="flex" group="rare" description="FlexScript">

    <filename>/\.(src|inc|inf)$/i</filename>



  <!--  other types  -->

  <prototype name="ass" group="other" description="(Advanced) SubStation Alpha script">

    <filename>/\.(ssa|ass)$/</filename>

  <prototype name="cue" group="other" description="Cue sheet">

    <filename>/\.cue$/</filename>

  <prototype name="filesbbs" group="other" description="files.bbs">

    <filename>/(files\.bbs|descript\.ion|file_id.diz)/i</filename>

  <prototype name="diff" group="other" description="Diff/Patch">

    <filename>/\.(diff.*|patch|rej(ect)?)$/i</filename>

  <prototype name="text" group="other" description="plain text">

    <filename>/(read\.?me|\.txt$|\.rus|\.nfo|\.log|install*|*ChangeLog*|AUTHORS|COPYING|FAQ|LICENSE|TODO$)/i</filename>
    <filename>/\.spo/ix</filename>


  <prototype name="default" group="other" description="default type">
    <filename weight='1'>//</filename>
0