How to make a simple calculator syntax highlighting

Answered

I'm making a custom language support plugin according to this tutorial and I'm stuck with a few .bnf concepts. Let's say I want to parse a simple calculator language that supports +,-,*,/,unary -, and parentheses. Here's what I currently have:

Flex:

package com.intellij.circom;

import com.intellij.lexer.FlexLexer;
import com.intellij.psi.tree.IElementType;
import com.intellij.circom.psi.CircomTypes;
import com.intellij.psi.TokenType;

%%

%class CircomLexer
%implements FlexLexer
%unicode
%function advance
%type IElementType
%eof{ return;
%eof}

WHITESPACE = [ \n\r\t]+
NUMBER = [0-9]+

%%

{WHITESPACE} { return TokenType.WHITE_SPACE; }
{NUMBER} { return CircomTypes.NUMBER; }

Bnf:

{
parserClass="com.intellij.circom.parser.CircomParser"

extends="com.intellij.extapi.psi.ASTWrapperPsiElement"

psiClassPrefix="Circom"
psiImplClassSuffix="Impl"
psiPackage="com.intellij.circom.psi"
psiImplPackage="com.intellij.circom.psi.impl"

elementTypeHolderClass="com.intellij.circom.psi.CircomTypes"
elementTypeClass="com.intellij.circom.psi.CircomElementType"
tokenTypeClass="com.intellij.circom.psi.CircomTokenType"
}

expr ::=
expr ('+' | '-') expr
| expr ('*' | '/') expr
| '-' expr
| '(' expr ')'
| literal;
literal ::= NUMBER;

First it complains that expr is recursive. How do I rewrite it to not be recursive? Second, when I try to compile and run it, it freezes idea test instance when trying to parse this syntax, looks like an endless loop.

2 comments
Comment actions Permalink

Please follow this tutorial instead https://github.com/JetBrains/Grammar-Kit/blob/master/HOWTO.md#24-compact-expression-parsing-with-priorities

You can also test your grammar in the current IDE directly using "Live Preview" (right-click inside *.bnf file)

0
Comment actions Permalink

I have done this.
A calculator.
You can check my projects sources from maven : one.empty3: empty3-library-3d
class AlgebraicTree
Or sources on GitHub : project empty3.

Simple concepts: tree structure, string test/succeed/error parser, evaluator, letters variables setter.

For scalar computing. 

Ah sorry. Syntax highlighter. I have a tree structure with class differently named. Put a char start and ending from string and colorize yours string. A rollback and partial tree for errors.

That's how I'd do this.

0

Please sign in to leave a comment.