mirror of
https://github.com/JetBrains/intellij-sdk-code-samples.git
synced 2025-07-30 10:17:50 +08:00
188 lines
12 KiB
HTML
188 lines
12 KiB
HTML
|
|
|
|
|
|
<!doctype html>
|
|
<html lang="en-US">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>3. Grammar and Parser / IntelliJ Platform SDK DevGuide</title>
|
|
<link rel="stylesheet" href="/intellij/sdk/docs/app/css/styles.min.css">
|
|
|
|
<!-- non-retina iPad pre iOS 7 -->
|
|
<link rel="apple-touch-icon" href="/intellij/sdk/docs/apple-touch-icon-72x72.png" sizes="72x72">
|
|
|
|
<!-- retina iPhone pre iOS 7 -->
|
|
<link rel="apple-touch-icon" href="/intellij/sdk/docs/apple-touch-icon-114x114.png" sizes="114x114">
|
|
|
|
<!-- retina iPad pre iOS 7 -->
|
|
<link rel="apple-touch-icon" href="/intellij/sdk/docs/apple-touch-icon-144x144.png" sizes="144x144">
|
|
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/intellij/sdk/docs/apple-touch-icon-precomposed.png">
|
|
|
|
<!-- normal favicon -->
|
|
<link rel="shortcut icon" type="image/x-icon" href="/intellij/sdk/docs/favicon.ico">
|
|
<link rel="icon" type="image/png" href="/intellij/sdk/docs/favicon.png">
|
|
<link rel="stylesheet" href="/intellij/sdk/docs/styles/styles.css"></head>
|
|
<body data-id="tutorials/custom_language_support/grammar_and_parser">
|
|
<div class="wrapper">
|
|
<section class="panel _nav">
|
|
<header class="panel__header">
|
|
<div class="container">
|
|
<form class="search-box">
|
|
<label for="search-box__input" class="search-box__label">
|
|
<input type="text" class="search-box__input" id="search-box__input" placeholder="Search IntelliJ Platform SDK DevGuide">
|
|
</label>
|
|
<div class="search-box__clear" title="Clear"></div>
|
|
</form>
|
|
</div>
|
|
</header>
|
|
<nav class="panel__content">
|
|
<div class="container _nav">
|
|
<menu class="nav-tree"></menu>
|
|
</div>
|
|
<div class="container _footer panel__footer">
|
|
<p><a href="https://youtrack.jetbrains.com/issues/IJSDK">Send feedback</a></p>
|
|
<p>© 2000–2016 <a href="//www.jetbrains.com">JetBrains</a> s.r.o.<br>
|
|
All rights reserved.</p>
|
|
</div>
|
|
</nav>
|
|
</section>
|
|
|
|
<main class="panel _main" role="main">
|
|
<header class="panel__header">
|
|
<div class="container">
|
|
<h3>IntelliJ Platform SDK DevGuide</h3>
|
|
|
|
<div class="shortcuts-switcher"><label for="switch-shortcuts">Keymap:</label><select id="switch-shortcuts" class="select _shortcuts" height="1">
|
|
<option data-group="primary" value="default" selected>Default</option>
|
|
<option data-group="primary" value="default_for_gnome">GNOME</option>
|
|
<option data-group="primary" value="default_for_kde">KDE</option>
|
|
<option data-group="primary" value="default_for_xwin">XWindow</option>
|
|
<option data-group="primary" value="emacs">Emacs</option>
|
|
<option data-group="primary" value="jbuilder">JBuilder</option>
|
|
<option data-group="primary" value="visual_studio">Visual Studio</option>
|
|
<option data-group="primary" value="netbeans_6.5">NetBeans 6.5</option>
|
|
<option data-group="primary" value="eclipse">Eclipse</option>
|
|
<option data-group="secondary" value="mac_os_x_10.5_">OS X 10.5+</option>
|
|
<option data-group="secondary" value="mac_os_x">OS X</option>
|
|
<option data-group="secondary" value="eclipse_mac_os_x">OS X Eclipse</option></select>
|
|
</div>
|
|
|
|
<div class="panel-trigger"></div>
|
|
</div>
|
|
</header>
|
|
<section class="panel__content">
|
|
<div class="container">
|
|
<article class="article" data-shortcut-switcher="false">
|
|
|
|
<h1>3. Grammar and Parser</h1>
|
|
<a name="define-a-token-type" class="elem-anchor"></a>
|
|
<h3>3.1. Define a token type<a href="#define-a-token-type" class="anchor-link"><span></span></a></h3>
|
|
|
|
<pre><code class="code-block__wrapper code-block _highlighted lang_java"><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">simpleplugin</span><span class="o">.</span><span class="na">psi</span><span class="o">;</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">com.intellij.psi.tree.IElementType</span><span class="o">;</span>
|
|
<span class="kn">import</span> <span class="nn">com.simpleplugin.SimpleLanguage</span><span class="o">;</span>
|
|
<span class="kn">import</span> <span class="nn">org.jetbrains.annotations.NonNls</span><span class="o">;</span>
|
|
<span class="kn">import</span> <span class="nn">org.jetbrains.annotations.NotNull</span><span class="o">;</span>
|
|
|
|
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">SimpleTokenType</span> <span class="kd">extends</span> <span class="n">IElementType</span> <span class="o">{</span>
|
|
<span class="kd">public</span> <span class="nf">SimpleTokenType</span><span class="o">(</span><span class="nd">@NotNull</span> <span class="nd">@NonNls</span> <span class="n">String</span> <span class="n">debugName</span><span class="o">)</span> <span class="o">{</span>
|
|
<span class="kd">super</span><span class="o">(</span><span class="n">debugName</span><span class="o">,</span> <span class="n">SimpleLanguage</span><span class="o">.</span><span class="na">INSTANCE</span><span class="o">);</span>
|
|
<span class="o">}</span>
|
|
|
|
<span class="nd">@Override</span>
|
|
<span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">()</span> <span class="o">{</span>
|
|
<span class="k">return</span> <span class="s">"SimpleTokenType."</span> <span class="o">+</span> <span class="kd">super</span><span class="o">.</span><span class="na">toString</span><span class="o">();</span>
|
|
<span class="o">}</span>
|
|
<span class="o">}</span>
|
|
</code></pre>
|
|
|
|
<a name="define-an-element-type" class="elem-anchor"></a>
|
|
<h3>3.2. Define an element type<a href="#define-an-element-type" class="anchor-link"><span></span></a></h3>
|
|
|
|
<pre><code class="code-block__wrapper code-block _highlighted lang_java"><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">simpleplugin</span><span class="o">.</span><span class="na">psi</span><span class="o">;</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">com.intellij.psi.tree.IElementType</span><span class="o">;</span>
|
|
<span class="kn">import</span> <span class="nn">com.simpleplugin.SimpleLanguage</span><span class="o">;</span>
|
|
<span class="kn">import</span> <span class="nn">org.jetbrains.annotations.NonNls</span><span class="o">;</span>
|
|
<span class="kn">import</span> <span class="nn">org.jetbrains.annotations.NotNull</span><span class="o">;</span>
|
|
|
|
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">SimpleElementType</span> <span class="kd">extends</span> <span class="n">IElementType</span> <span class="o">{</span>
|
|
<span class="kd">public</span> <span class="nf">SimpleElementType</span><span class="o">(</span><span class="nd">@NotNull</span> <span class="nd">@NonNls</span> <span class="n">String</span> <span class="n">debugName</span><span class="o">)</span> <span class="o">{</span>
|
|
<span class="kd">super</span><span class="o">(</span><span class="n">debugName</span><span class="o">,</span> <span class="n">SimpleLanguage</span><span class="o">.</span><span class="na">INSTANCE</span><span class="o">);</span>
|
|
<span class="o">}</span>
|
|
<span class="o">}</span>
|
|
</code></pre>
|
|
|
|
<a name="define-grammar" class="elem-anchor"></a>
|
|
<h3>3.3. Define grammar<a href="#define-grammar" class="anchor-link"><span></span></a></h3>
|
|
|
|
<p>Define a grammar for the properties language with <em>/com/simpleplugin/Simple.bnf</em> file.</p>
|
|
|
|
<pre><code class="code-block__wrapper code-block _highlighted lang_java"><span class="o">{</span>
|
|
<span class="n">parserClass</span><span class="o">=</span><span class="s">"com.simpleplugin.parser.SimpleParser"</span>
|
|
|
|
<span class="kd">extends</span><span class="o">=</span><span class="s">"com.intellij.extapi.psi.ASTWrapperPsiElement"</span>
|
|
|
|
<span class="n">psiClassPrefix</span><span class="o">=</span><span class="s">"Simple"</span>
|
|
<span class="n">psiImplClassSuffix</span><span class="o">=</span><span class="s">"Impl"</span>
|
|
<span class="n">psiPackage</span><span class="o">=</span><span class="s">"com.simpleplugin.psi"</span>
|
|
<span class="n">psiImplPackage</span><span class="o">=</span><span class="s">"com.simpleplugin.psi.impl"</span>
|
|
|
|
<span class="n">elementTypeHolderClass</span><span class="o">=</span><span class="s">"com.simpleplugin.psi.SimpleTypes"</span>
|
|
<span class="n">elementTypeClass</span><span class="o">=</span><span class="s">"com.simpleplugin.psi.SimpleElementType"</span>
|
|
<span class="n">tokenTypeClass</span><span class="o">=</span><span class="s">"com.simpleplugin.psi.SimpleTokenType"</span>
|
|
|
|
<span class="n">psiImplUtilClass</span><span class="o">=</span><span class="s">"com.simpleplugin.psi.impl.SimplePsiImplUtil"</span>
|
|
<span class="o">}</span>
|
|
|
|
<span class="n">simpleFile</span> <span class="o">::=</span> <span class="n">item_</span><span class="o">*</span>
|
|
|
|
<span class="kd">private</span> <span class="n">item_</span> <span class="o">::=</span> <span class="o">(</span><span class="n">property</span><span class="o">|</span><span class="n">COMMENT</span><span class="o">|</span><span class="n">CRLF</span><span class="o">)</span>
|
|
|
|
<span class="n">property</span> <span class="o">::=</span> <span class="o">(</span><span class="n">KEY</span><span class="o">?</span> <span class="n">SEPARATOR</span> <span class="n">VALUE</span><span class="o">?)</span> <span class="o">|</span> <span class="n">KEY</span> <span class="o">{</span><span class="n">mixin</span><span class="o">=</span><span class="s">"com.simpleplugin.psi.impl.SimpleNamedElementImpl"</span>
|
|
<span class="kd">implements</span><span class="o">=</span><span class="s">"com.simpleplugin.psi.SimpleNamedElement"</span> <span class="n">methods</span><span class="o">=[</span><span class="n">getKey</span> <span class="n">getValue</span> <span class="n">getName</span> <span class="n">setName</span> <span class="n">getNameIdentifier</span> <span class="n">getPresentation</span><span class="o">]}</span>
|
|
</code></pre>
|
|
|
|
<p>As you see a properties file can contain properties, comments and line breaks.</p>
|
|
|
|
<p>The grammar defines how flexible the support for a language can be.
|
|
We specified that a property may have or may not have key and value.
|
|
This lets the IDE still recognise incorrectly defined properties and provide corresponding code analysis and quick-fixes.</p>
|
|
|
|
<a name="generate-a-parser" class="elem-anchor"></a>
|
|
<h3>3.4. Generate a parser<a href="#generate-a-parser" class="anchor-link"><span></span></a></h3>
|
|
|
|
<p>Now when the grammar is defined we can generate a parser with PSI classes via <em>Generate Parser Code</em> from the context menu or via <em>⌘⇧G</em> shortcut on <em>Simple.bnf</em> file.
|
|
The Grammar-Kit will generate a parser and PSI elements in <em>gen</em> folder.
|
|
Mark this folder as a source root and make sure everything is compiled without errors.</p>
|
|
|
|
<p><img src="img/generated_parser.png" alt="Parser" /></p>
|
|
|
|
<hr />
|
|
<p><a href="language_and_filetype.html"><span>Previous</span></a>
|
|
<a href="/intellij/sdk/docs/tutorials/custom_language_support_tutorial.html"><span>Top</span></a>
|
|
<a href="lexer_and_parser_definition.html"><span>Next</span></a></p>
|
|
|
|
|
|
|
|
<div class="last-modified">
|
|
Last modified: 28 December 2015
|
|
</div>
|
|
</article>
|
|
|
|
<section class="disqus">
|
|
<div id="disqus_thread"></div>
|
|
</section>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
</div>
|
|
|
|
|
|
<script data-main="/intellij/sdk/docs/app/js/main.build" data-baseurl="/intellij/sdk/docs/" src="/intellij/sdk/docs/app/js/vendor/requirejs/require.js"></script>
|
|
|
|
</body>
|
|
</html>
|
|
|