如何构建我的 XText 终端? WORDS/SL_STRING/ML_STRING
How to structure my XText terminals? WORDS/SL_STRING/ML_STRING
在我的 XText DSL 中,我希望能够使用三种不同类型的文本终端。它们都用于在 UML 图中绘制的箭头顶部添加注释:
终端WORD:
Actor -> Actor: WORD
终端SL_STRINGS:
Actor -> Actor: A sequence of words on a single line
终端ML_STRINGS:
Actor -> Actor: A series of words on
multiple
lines
我最初的方法是使用 org.eclipse.xtext.common.Terminals
的 ID 终端作为我的 WORD 终端,然后只需要SL_STRINGS是(WORD)*
,而ML_STRINGS是(NEWLINE? WORD)*
,但这创造了很多规则之间存在歧义的问题。
我将如何以一种好的方式构建它?
有关该项目的更多信息。 (这是第一次使用 XText,请多多包涵):
我正在尝试实现一个 DSL 以与 PlantUML 的 Eclipse 插件一起使用 http://plantuml.sourceforge.net/sequence.html 主要用于语法检查和着色。目前我的语法是这样的:
Model:
(diagrams+=Diagram)*;
Diagram:
'@startuml' NEWLINE (instructions+=(Instruction))* '@enduml' NEWLINE*
;
一条指令可以是很多东西:
Instruction:
((name1=ID SEQUENCE name2=ID (':' ID)?)
| Definition (Color)?
| AutoNumber
| Title
| Legend
| Newpage
| AltElse
| GroupingMessages
| Note
| Divider
| Reference
| Delay
| Space
| Hidefootbox
| Lifeline
| ParticipantCreation
| Box)? NEWLINE
;
需要不同类型文本终端的规则示例:
Group:
'group' TEXT
;
Reference:
'ref over' ID (',' ID)* ((':' SL_TEXT)|((ML_TEXT) NEWLINE 'end ref'))
;
对于Group,文本只能在一行,而对于Reference,如果规则调用后没有“:”,文本可以在两行。
目前我的终端是这样的:
terminal NEWLINE : ('\r'? '\n');
// Multiline comment begins with /', and ends with '/
terminal ML_COMMENT : '/\'' -> '\'/';
// Singleline comment begins with ', and continues until end of line.
terminal SL_COMMENT : '\'' !('\n'|'\r')* ('\r'? '\n')?;
// INT is a sequence of numbers 0-9.
terminal INT returns ecore::EInt: ('0'..'9')+;
terminal WS : (' '|'\t')+;
terminal ANY_OTHER: .;
除此之外,我还想添加三个处理文本的新终端。
您应该实施数据类型规则以实现所需的行为。
塞巴斯蒂安写了一篇关于此主题的精彩博客 post,可在此处找到:http://zarnekow.blogspot.de/2012/11/xtext-corner-6-data-types-terminals-why.html
这是一个最小的语法示例:
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Model:
greetings+=Greeting*;
Greeting:
'Example' ':' comment=Comment;
Comment:
(ID ('\r'? '\n')?)+
;
这将允许你写这样的东西:
Example: A series of words
Example: A series of words on
multiple lines
然后您可能想要实现自己的 value converter 以便微调到字符串的转换。
如果有帮助请告诉我!
在我的 XText DSL 中,我希望能够使用三种不同类型的文本终端。它们都用于在 UML 图中绘制的箭头顶部添加注释:
终端WORD:
Actor -> Actor: WORD
终端SL_STRINGS:
Actor -> Actor: A sequence of words on a single line
终端ML_STRINGS:
Actor -> Actor: A series of words on
multiple
lines
我最初的方法是使用 org.eclipse.xtext.common.Terminals
的 ID 终端作为我的 WORD 终端,然后只需要SL_STRINGS是(WORD)*
,而ML_STRINGS是(NEWLINE? WORD)*
,但这创造了很多规则之间存在歧义的问题。
我将如何以一种好的方式构建它?
有关该项目的更多信息。 (这是第一次使用 XText,请多多包涵):
我正在尝试实现一个 DSL 以与 PlantUML 的 Eclipse 插件一起使用 http://plantuml.sourceforge.net/sequence.html 主要用于语法检查和着色。目前我的语法是这样的:
Model:
(diagrams+=Diagram)*;
Diagram:
'@startuml' NEWLINE (instructions+=(Instruction))* '@enduml' NEWLINE*
;
一条指令可以是很多东西:
Instruction:
((name1=ID SEQUENCE name2=ID (':' ID)?)
| Definition (Color)?
| AutoNumber
| Title
| Legend
| Newpage
| AltElse
| GroupingMessages
| Note
| Divider
| Reference
| Delay
| Space
| Hidefootbox
| Lifeline
| ParticipantCreation
| Box)? NEWLINE
;
需要不同类型文本终端的规则示例:
Group:
'group' TEXT
;
Reference:
'ref over' ID (',' ID)* ((':' SL_TEXT)|((ML_TEXT) NEWLINE 'end ref'))
;
对于Group,文本只能在一行,而对于Reference,如果规则调用后没有“:”,文本可以在两行。
目前我的终端是这样的:
terminal NEWLINE : ('\r'? '\n');
// Multiline comment begins with /', and ends with '/
terminal ML_COMMENT : '/\'' -> '\'/';
// Singleline comment begins with ', and continues until end of line.
terminal SL_COMMENT : '\'' !('\n'|'\r')* ('\r'? '\n')?;
// INT is a sequence of numbers 0-9.
terminal INT returns ecore::EInt: ('0'..'9')+;
terminal WS : (' '|'\t')+;
terminal ANY_OTHER: .;
除此之外,我还想添加三个处理文本的新终端。
您应该实施数据类型规则以实现所需的行为。 塞巴斯蒂安写了一篇关于此主题的精彩博客 post,可在此处找到:http://zarnekow.blogspot.de/2012/11/xtext-corner-6-data-types-terminals-why.html
这是一个最小的语法示例:
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Model:
greetings+=Greeting*;
Greeting:
'Example' ':' comment=Comment;
Comment:
(ID ('\r'? '\n')?)+
;
这将允许你写这样的东西:
Example: A series of words
Example: A series of words on
multiple lines
然后您可能想要实现自己的 value converter 以便微调到字符串的转换。
如果有帮助请告诉我!