首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >intellij语法中的字符串和字符标记-工具包BNF语法在PSI预览模式下无法识别

intellij语法中的字符串和字符标记-工具包BNF语法在PSI预览模式下无法识别
EN

Stack Overflow用户
提问于 2020-11-24 16:40:37
回答 1查看 210关注 0票数 1

我正在尝试为intellij开发一个语言插件,并且正在按照教程使用Grammar-Kit和PSI插件。我已经开发了一个简单的基于BNF的语法,但它在PSI预览中不起作用。语法如下:

代码语言:javascript
复制
{
  parserClass="org.intellij.sdk.language.parser.ASTRAParser"

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

  psiClassPrefix="ASTRA"
  psiImplClassSuffix="Impl"
  psiPackage="org.intellij.sdk.language.psi"
  psiImplPackage="org.intellij.sdk.language.psi.impl"

  elementTypeHolderClass="org.intellij.sdk.language.psi.ASTRATypes"
  elementTypeClass="org.intellij.sdk.language.psi.ASTRAElementType"
  tokenTypeClass="org.intellij.sdk.language.psi.ASTRATokenType"

  psiImplUtilClass="org.intellij.sdk.language.psi.impl.ASTRAPsiImplUtil"

  tokens=[
    space='regexp:\s+'
    comment='regexp:((/[*])([\s\S]+)([*]/))|([/]{2,}[^\n]+)'
    char="regexp:'\\.'"
    string='regexp:"([^"\\]|\\.)*"'
    id='regexp:\p{Alpha}\w*'

    PERIOD='.'
    COMMA=','
    SEMI=';'

    INT='int'
    LONG='long'
    FLOAT='float'
    DOUBLE='double'
    STRING='string'
    CHAR='char'
    BOOLEAN='boolean'
    FUNCT='funct'
    LIST='list'
  ]
}

astraFile ::= [package] agent
package ::= 'package' className SEMI
className ::= id (PERIOD id)*
agent ::= 'agent' id ['extends' id (COMMA id)*] '{' statement* '}'
statement ::= module | types | initial

module ::= 'module' className id SEMI

types ::= 'types' id '{' formula* '}'
formula ::= 'formula' signature SEMI
signature ::= id '(' [type (COMMA type)*] ')'

initial ::= 'initial' atom (COMMA atom)* SEMI
private atom ::= goal | predicate
goal ::= '!' predicate
predicate ::= id '(' arg ')'
private arg ::= variable
    | literal
    | id
private literal ::= string | char
variable ::= type id
type ::= INT | LONG | FLOAT | DOUBLE | STRING | CHAR | BOOLEAN | FUNCT | LIST | className

测试程序为:

代码语言:javascript
复制
agent test {
    initial test("dd");
}

错误是‘字符串预期,得到“dd”:2“”

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2020-11-24 18:44:24

所以,我自己解决了这个问题--原来'char‘和' string’是保留标记,它们的语法与字符串的"(.)*“和”.“不匹配。对于一个角色来说。我将标记的名称分别更改为stringlit和character,它起作用了。修改后的语法如下:

代码语言:javascript
复制
{
  parserClass="org.intellij.sdk.language.parser.ASTRAParser"

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

  psiClassPrefix="ASTRA"
  psiImplClassSuffix="Impl"
  psiPackage="org.intellij.sdk.language.psi"
  psiImplPackage="org.intellij.sdk.language.psi.impl"

  elementTypeHolderClass="org.intellij.sdk.language.psi.ASTRATypes"
  elementTypeClass="org.intellij.sdk.language.psi.ASTRAElementType"
  tokenTypeClass="org.intellij.sdk.language.psi.ASTRATokenType"

  psiImplUtilClass="org.intellij.sdk.language.psi.impl.ASTRAPsiImplUtil"

  tokens=[
    space='regexp:\s+'
    comment='regexp:((/[*])([\s\S]+)([*]/))|([/]{2,}[^\n]+)'
    character="regexp:'.'"
    stringlit='regexp:"([^"\\]|\\.)*"'
    id='regexp:\p{Alpha}\w*'

    PERIOD='.'
    COMMA=','
    SEMI=';'

    INT='int'
    LONG='long'
    FLOAT='float'
    DOUBLE='double'
    STRING='string'
    CHAR='char'
    BOOLEAN='boolean'
    FUNCT='funct'
    LIST='list'
  ]
}

astraFile ::= [package] agent
package ::= 'package' className SEMI
className ::= id (PERIOD id)*
agent ::= 'agent' id ['extends' id (COMMA id)*] '{' statement* '}'
statement ::= module | types | initial

module ::= 'module' className id SEMI

types ::= 'types' id '{' formula* '}'
formula ::= 'formula' signature SEMI
signature ::= id '(' [type (COMMA type)*] ')'

initial ::= 'initial' atom (COMMA atom)* SEMI
private atom ::= goal | predicate
goal ::= '!' predicate
predicate ::= id '(' arg ')'
private arg ::= variable
    | literal
    | id
private literal ::= stringlit | character
variable ::= type id
type ::= INT | LONG | FLOAT | DOUBLE | STRING | CHAR | BOOLEAN | FUNCT | LIST | className
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64982905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档