5

我以前从未使用过 JFlex,也不知道它是如何工作的。基本上,我已经为 Java 中的方案式语言构建了一个运行时,并且我拥有的解析器是使用 Antlr 4 生成的,所以我有一个 .g4 文件,如下所示:

program: expression EOF;
expression: lambdaAbstraction | application| literal;

lambdaAbstraction: LP WS? LAMBDA (WS IDENTIFIER)* WS expression WS? RP;
application: LP WS? expression (WS expression)* WS? RP;
literal: FLOAT_LITERAL | INTEGER_LITERAL | IDENTIFIER | STRING_LITERAL;

STRING_LITERAL: '"' ~["]* '"' | '\'' ~[']* '\'' ;
FLOAT_LITERAL: [0-9]+ '.' [0-9]+;
INTEGER_LITERAL: [0-9]+;
IDENTIFIER: [a-zA-Z+/*-=?@]+;
LAMBDA: '\\';
LP: '(';
RP: ')';
WS: [ \n\r\t]+;

一些例子(这样你就可以感受一下语法)。

  1. (+ 1 2)= 3

  2. ((\ a b (+ a b)) 1 2)= 3

  3. (+ "Hello, " "World")=“你好,世界”

我想要做的是使用本指南为 IntelliJ-IDEA 构建一个语法高亮插件:http: //www.jetbrains.org/intellij/sdk/docs/tutorials/custom_language_support_tutorial.html

这是我的 .flex 文件

package com.michaelsnowden.yalcil_plugin;

import com.intellij.lexer.FlexLexer;
import com.intellij.psi.tree.IElementType;
import com.michaelsnowden.yalcil_plugin.psi.YalcilTypes;
import com.intellij.psi.TokenType;

%%

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

STRING_LITERAL= "\"" [^\"&]* "\"";
FLOAT_LITERAL=[0-9]+ '.' [0-9]+;
INTEGER_LITERAL=[0-9]+;
IDENTIFIER=[a-zA-Z+/*-=?@]+;
LAMBDA="\\";
LP="(";
RP=")";
WS=[ \n\r\t]+;
%%

<YYINITIAL> {
    {LAMBDA} { yybegin(YYINITIAL); return YalcilTypes.LAMBDA; }
    {FLOAT_LITERAL} { yybegin(YYINITIAL); return YalcilTypes.LAMBDA; }
    {INTEGER_LITERAL} { yybegin(YYINITIAL); return YalcilTypes.INTEGER_LITERAL; }
    {IDENTIFIER} { yybegin(YYINITIAL); return YalcilTypes.IDENTIFIER; }
    {LP} { yybegin(YYINITIAL); return YalcilTypes.LP; }
    {RP} { yybegin(YYINITIAL); return YalcilTypes.RP; }
    {WS} { yybegin(YYINITIAL); return YalcilTypes.WS; }
    {STRING_LITERAL} { yybegin(YYINITIAL); return YalcilTypes.STRING_LITERAL; }
}

. { return TokenType.BAD_CHARACTER; }

这是我的 .bnf 文件

{
  parserClass="com.michaelsnowden.yalcil_plugin.YalcilParser"

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

  psiClassPrefix="Yalcil"
  psiImplClassSuffix="Impl"
  psiPackage="com.michaelsnowden.yalcil_plugin.psi"
  psiImplPackage="com.michaelsnowden.yalcil_plugin.psi.impl"

  elementTypeHolderClass="com.michaelsnowden.yalcil_plugin.psi.YalcilTypes"
  elementTypeClass="com.michaelsnowden.yalcil_plugin.psi.YalcilElementType"
  tokenTypeClass="com.michaelsnowden.yalcil_plugin.psi.YalcilTokenType"
}

program ::= expression;
expression ::= lambdaAbstraction | application| literal;
lambdaAbstraction ::= LP WS? LAMBDA (WS IDENTIFIER)* WS expression WS? RP;
application ::= LP WS? expression (WS expression)* WS? RP;
literal ::= FLOAT_LITERAL | INTEGER_LITERAL | IDENTIFIER | STRING_LITERAL;

当我运行它时,我基本上什么都没有得到。

在此处输入图像描述

出于某种原因,仅突出显示字符串。

在此处输入图像描述

PsiViewer 看起来像这样:

在此处输入图像描述

有没有人看到为什么这不起作用的任何解释?

4

0 回答 0