我一直在为新语言开发编译器。我认为能够在语法感知环境中展示它的开发是很好的。该语言有很多自定义关键字,其结构与Java或C / C ++等常用语言有很大不同。
如何为Eclipse开发自定义语法highligher?我看过一些插件的引用,但文档不够彻底,不能满足初学者的需求。
我的语言有语法/ RE,以及相关关键字列表。
答案 0 :(得分:32)
听起来你正在处理DSL(域特定语言)。您正在寻找的内容与XText完全相同。以下是该页面的摘录:
Xtext是用于开发外部文本DSL的框架/工具。只需使用Xtext的简单EBNF语法语言描述您自己的DSL,生成器将创建一个解析器,一个AST-meta模型(在EMF中实现)以及一个功能齐全的Eclipse Text Editor。
另外,查看this video,这是对其中一个人的采访。我相信你会从这里拿走它: - )
您可能还想查看this plugin。不完全是你想要的,但可能是一个很好的开始。
答案 1 :(得分:15)
Eclipse框架使用相当复杂的文档模型来进行语法着色(它们称之为着色,而不是突出显示),它并不像在其他编辑器中那样简单。
如果您真的想尝试弄乱它,可能需要阅读the following from the Eclipse plug-in developer guide。
(以上链接现已死亡。This may be a similar document或this。)
答案 2 :(得分:4)
这正是LiClipse(http://www.liclipse.com/)的目标之一:轻松做一个具有语法高亮,基本代码完成,大纲等的编辑器,针对Eclipse - 请注意其核心(允许创建自定义语言) )最近成为开源:http://liclipse.blogspot.com.br/2016/05/liclipse-303-providing-back-to-open.html。
添加新语言不需要java技能(主要是创建一个新的.liclipse - 这是一个YAML文件在适当的位置并创建一些基本规则来说明如何对您的语言进行分区 - 即:通常只是将代码与字符串中的注释分开 - 并指定分区中的关键字已经为您提供了正确的语法突出显示。)
如果您下载它,插件\ com.brainwy.liclipse.editor \ languages中有很多示例,http://www.liclipse.com/text/supported_languages.html和http://www.liclipse.com/text/scope_definition.html有一些基本文档,说明如何操作。< / p>
答案 3 :(得分:1)
您可以使用Notepad ++的用户定义语言功能。我们通常使用Notepad ++来处理这种用例。因为它只是一个XML。此外,notepad ++提供了基于UI的编辑,用于定义特定于语言的语法。
答案 4 :(得分:0)
我刚刚尝试了 Eclipse Colorer ,它的确很棒(例如,突出显示,使用VBA文件(当然在受限的情况下),否则不支持)。
>它支持例如
这是受支持的扩展程序的完整列表:
(很难获取这些信息,因为这些信息没有在网络上被索引或发布,但是现在也应该由Google和co。找到。
我使用此正则表达式^\s+<(?!(!--|prototype|filename)).+>$
删除了所有行,以压缩完整文件和copy of eclipse\plugins\net.sf.colorer_0.9.9\colorer\hrc\proto.hrc
文件的内容。
随时更新)
<!-- 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>