web-dev-qa-db-fra.com

Comment créer un surligneur de syntaxe Eclipse personnalisé

J'ai développé un compilateur pour un nouveau langage. J'ai pensé qu'il serait intéressant de pouvoir démontrer son développement dans un environnement prenant en compte la syntaxe. Le langage comporte de nombreux mots-clés personnalisés et sa structure est très différente des langages courants tels que Java ou C/C++.

Comment puis-je développer un surligneur de syntaxe personnalisé pour Eclipse? J'ai vu quelques références à quelques plugins, mais la documentation n'est pas assez complète pour les besoins de mes débutants.

J'ai une grammaire/RE pour ma langue, ainsi que des listes de mots clés pertinents.

35
Willi Ballenthin

Le framework Eclipse utilise un modèle de document assez complexe pour colorer la syntaxe (ils l'appellent colorer, et non en surbrillance), ce n'est pas aussi simple que dans les autres éditeurs. 

Si vous voulez vraiment essayer de jouer avec cela, vous voudrez peut-être lire le texte suivant du guide du développeur de plug-in Eclipse .

(Le lien ci-dessus est maintenant mort. Cela peut être un document similaire ou ceci .)

14
Uri

On dirait que vous avez affaire à un DSL (Domain Specific Language). Ce que vous recherchez ressemble exactement à - XText . Voici un extrait de la page:

Xtext est un cadre/outil pour le développement de DSL textuelles externes. Décrivez simplement votre propre DSL en utilisant le langage de grammaire EBNF simple de Xtext et le générateur créera un analyseur syntaxique, un méta-modèle AST (implémenté dans EMF) ainsi qu'un éditeur de texte complet Eclipse. 

Regardez aussi cette vidéo qui est une interview de l’une des personnes qui l’a derrière. Je suis sûr que vous allez le prendre d'ici :-)

Vous pouvez également vouloir vérifier ce plugin . Pas exactement ce que vous recherchez, mais pourrait être un bon début.

31
zvikico

C'est exactement l'une des cibles de LiClipse ( http://www.liclipse.com/ ): créer facilement un éditeur avec mise en évidence de la syntaxe, compléter le code de base, définir les contours, etc. Eclipse - son noyau (qui permet de créer des langues personnalisées) est récemment devenu une source ouverte: http://liclipse.blogspot.com.br/2016/05/liclipse-303-providing-back-to-open.html .

Aucune compétence Java n'est requise pour ajouter une nouvelle langue (principalement créer un nouveau fichier .liclipse - qui est un fichier YAML - au bon endroit et créer quelques règles de base pour dire comment partitionner votre langue - c'est-à-dire: il suffit généralement de séparer le code des commentaires des chaînes - et spécifier les mots-clés que vous avez dans la partition vous donnerait déjà une mise en évidence correcte de la syntaxe).

Si vous le téléchargez, vous trouverez plusieurs exemples sur plugins\com.brainwy.liclipse.editor\languages ​​et des informations de base sur http://www.liclipse.com/text/supported_languages.html et http://www.liclipse.com/text/scope_definition.html sur la façon de le faire.

4
Fabio Zadrozny

Vous pouvez utiliser la fonctionnalité de langage défini par l'utilisateur de Notepad ++ à la place. Nous utilisons normalement Notepad ++ pour un tel cas d'utilisation. En cela, il ne s'agit que d'un XML. Notepad ++ propose également une édition basée sur l'interface utilisateur permettant de définir votre grammaire spécifique à une langue.

1
srsforj

Je viens d’essayerEclipse Coloreret c’est vraiment agréable (par exemple, pour mettre en surbrillance, travailler avec des fichiers VBA (dans un contexte restreint, bien sûr) qui, sinon, ne sont pas pris en charge).

il prend en charge par exemple.

  • pliage (comme vous pouvez le voir)
  • il supporte l'appariement de parenthèse (ouvrir/fermer)
  • Plus de 200 extensions de fichiers (voir ci-dessous)

 editor of some *.cls and *.bas file

 preferences - file types

plus captures d'écran sur leur site

voici une liste complète des extensions supportées:

(Il est difficile d’obtenir ces informations car elles ne sont ni indexées ni postées quelque part sur le Web, mais devraient également être trouvées par Google et ses partenaires.
J'ai supprimé toutes les lignes avec cette regex ^\s+<(?!(!--|prototype|filename)).+>$ pour condenser le contenu de la copie complète et de Eclipse\plugins\net.sf.colorer_0.9.9\colorer\hrc\proto.hrc fichier.
N'hésitez pas à mettre à jour les mises à jour)
} _

  <!--  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
Andreas Dietrich