我正在尝试为intellij开发一个语言插件,并且正在按照教程使用Grammar-Kit和PSI插件。我已经开发了一个简单的基于BNF的语法,但它在PSI预览中不起作用。语法如下:
{
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测试程序为:
agent test {
initial test("dd");
}错误是‘字符串预期,得到“dd”:2“”
任何帮助都将不胜感激。
发布于 2020-11-24 18:44:24
所以,我自己解决了这个问题--原来'char‘和' string’是保留标记,它们的语法与字符串的"(.)*“和”.“不匹配。对于一个角色来说。我将标记的名称分别更改为stringlit和character,它起作用了。修改后的语法如下:
{
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 | classNamehttps://stackoverflow.com/questions/64982905
复制相似问题