当前位置: 首页 > 知识库问答 >
问题:

如何在xtext中允许引用空格

吕学
2023-03-14

从终端创建myDSL语法

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

起点,包含行列表

Model: 
    lines+=LINE*;   

每一行都可以选择以LABEL开始,然后以关键字开始

LINE: 
    LABEL? outTest=DIRECTIVES;

//Line may start with only label with comma separated strings   
LABEL: 
    inputs+=MYSTRING  (',' inputs+=MYSTRING )*;

//Different supported keyword directives
DIRECTIVES : 
    WITHOUT_OPERANDS | WITH_MYSTRING| WITH_ONLY_MYSTRING;

//Directive for END tag
WITHOUT_OPERANDS: 
    tag=('END') (',')? (inputs+=MYSTRING)*;

//Directive for BEGIN tag
WITH_MYSTRING: 
    tag=('BEGIN') (inputs+=MYSTRING)* (',' inputs+=MYSTRING)*;

// Directive for PRINT tag
WITH_ONLY_MYSTRING: 
    tag=('PRINT') inputs+=MYSTRING*;

//Each string may or maynot contain quotes with empty string
MYSTRING hidden(WS):
    (UNQUOTED|QUOTED)+;

//Terminal String for match quoted string including empty one
terminal QUOTED:
    "'" ( '\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\'|"'") )* "'"    
;

//Terminal string matching all other 
terminal UNQUOTED:
    ('A'..'Z'|'a'..'z'|'_' |'0'..'9'|'-'|'#'|'='|'?'|'!'| '$'|'@'|"/"| '(' | ')'|'+'|'<'|'>'|'.'|"'"|"\\"|'"'|'*')*
;

这个语法适用于单引号中有空格的字符串。但是它有很多错误/警告

警告(200):/组织。xtext。实例mydsl/src gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl。g:309:3:决策可以使用多个选项匹配输入,例如“RULE_UNQUOTED”:1、2因此,该输入警告(200)禁用了选项2/组织。xtext。实例mydsl/src gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl。g:309:3:决策可以使用多个备选方案匹配输入,例如“RULE_QUOTED”:1、2因此,备选方案2被禁用,用于该输入警告(200):/组织。xtext。实例mydsl/src gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl。g:361:3:决策可以使用多个选项匹配输入,例如“RULE_UNQUOTED”:1、2因此,选项2被禁用,用于该输入警告(200):/组织。xtext。实例mydsl/src gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl。g:361:3:决策可以使用多个备选方案匹配输入,例如“RULE_QUOTED”:1、2因此,备选方案2被禁用,用于该输入警告(200):/组织。xtext。实例mydsl/src gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl。g:438:3:决策可以使用多个选项匹配输入,例如“RULE_UNQUOTED”:1、2因此,选项2被禁用,用于该输入警告(200):/组织。xtext。实例mydsl/src gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl。g:438:3:决策可以使用多个备选方案匹配输入,例如“RULE_QUOTED”:1、2因此,备选方案2被禁用,用于该输入警告(200):/组织。xtext。实例mydsl/src gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl。g:479:2:决策可以使用多个选项匹配输入,例如“RULE_QUOTED”:2,3因此,选项3被禁用,用于该输入警告(200):/组织。xtext。实例mydsl/src gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl。g:479:2:决策可以使用多个备选方案匹配输入,例如“RULE_UNQUOTED”:1、3。因此,备选方案3因输入错误而被禁用(208):/组织。xtext。实例mydsl/src gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl。g:491:1:以下令牌定义永远无法匹配,因为之前的令牌与相同的输入匹配:RULE_INT warning(200):/组织。xtext。实例mydsl。ide/src gen/org/xtext/example/mydsl/ide/contentassist/antlr/internal/InternalMyDsl。g:257:33:决策可以使用多个备选方案来匹配输入,例如“RULE_UNQUOTED”:1、2。因此,备选方案2被禁用,用于该输入警告(200):/组织。xtext。实例mydsl。ide/src gen/org/xtext/example/mydsl/ide/contentassist/antlr/internal/InternalMyDsl。g:257:33:决策可以使用多个备选方案匹配输入,例如“RULE_QUOTED”:1、2因此,备选方案2被禁用,用于该输入警告(200):/组织。xtext。实例mydsl。ide/src gen/org/xtext/example/mydsl/ide/contentassist/antlr/internal/InternalMyDsl。g:549:45:决策可以使用多个选项匹配输入,例如“RULE_UNQUOTED”:1、2因此,选项2被禁用,用于该输入警告(200):/组织。xtext。实例mydsl。ide/src gen/org/xtext/example/mydsl/ide/contentassist/antlr/internal/InternalMyDsl。g:549:45:决策可以使用多个备选方案匹配输入,例如“RULE_QUOTED”:1、2因此,备选方案2被禁用,用于该输入警告(200):/组织。xtext。实例mydsl。ide/src gen/org/xtext/example/mydsl/ide/contentassist/antlr/internal/InternalMyDsl。g:604:42:决策可以使用多个备选方案匹配输入,例如“RULE_QUOTED”:1、2因此,备选方案2被禁用,用于该输入警告(200):/组织。xtext。实例mydsl。ide/src gen/org/xtext/example/mydsl/ide/contentassist/antlr/internal/InternalMyDsl。g:604:42:决策可以使用多个选项匹配输入,例如“RULE_UNQUOTED”:1、2因此,该输入警告(200)禁用了选项2/组织。xtext。实例mydsl。ide/src gen/org/xtext/example/mydsl/ide/contentassist/antlr/internal/InternalMyDsl。g:738:47:决策可以使用多个备选方案匹配输入,例如“RULE_QUOTED”:1、2因此,备选方案2被禁用,用于该输入警告(200):/组织。xtext。实例mydsl。ide/src gen/org/xtext/example/mydsl/ide/contentassist/antlr/internal/InternalMyDsl。g:738:47:决策可以使用多个备选方案匹配输入,例如“RULE_UNQUOTED”:1、2因此,备选方案2因该输入错误而被禁用(208):/组织。xtext。实例mydsl。ide/src gen/org/xtext/example/mydsl/ide/contentassist/antlr/internal/InternalMyDsl。g:930:1:以下标记定义永远无法匹配,因为之前的标记匹配相同的输入:RULE_INT 8287[main]INFO text。xtext。发电机XtextGenerator-生成公共基础结构

我已经试过你更新的语法,但仍然不起作用。

输入文本:BEGIN ABC'123457

出现错误:角色“”处没有可行的替代方案

输入文本:打印ABC“”ABC

获取错误:外部输入'\r\n'需要EOF

输入文本:

开始ABC=12,def=34,ghij 123456

    xyx=123,abc=345                    000001

错误:输入\r\n\r\n时没有可行的替代方案

所有的警告都消失了,除了

错误(208):以下令牌定义永远无法匹配,因为先前的令牌匹配相同的输入:RULE_INT

错误(208):以下令牌定义永远无法匹配,因为先前的令牌匹配相同的输入:RULE_INT

共有1个答案

劳星晖
2023-03-14

您是否考虑使用两个终端规则和一个数据类型规则?

//Terminal string          
STRING_OPERANDS hidden():
    (UNQUOTED|QUOTED)+
;

//maybe needs adoption
terminal QUOTED:
    "'" ( '\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\'|"'") )* "'"    
;

terminal UNQUOTED:
    ('a'..'z' | 'A'..'Z' | '_' | '0'..'9' | '-' | '*' | "/" | "\\" | '(' | ')' | '$' | '=')*
;

或更新

grammar org.xtext.example.mydsl2.MyDsl hidden(WS, ML_COMMENT, SL_COMMENT)

import "http://www.eclipse.org/emf/2002/Ecore" as ecore

generate myDsl "http://www.xtext.org/example/mydsl2/MyDsl"

Model: 
    NL? lines+=LINE (NL lines+=LINE)* NL?;  

LINE: 
    label=LABEL? outTest=DIRECTIVES;

//Line may start with only label with comma separated strings   
LABEL: 
    inputs+=MYSTRING  (',' inputs+=MYSTRING )*;

//Different supported keyword directives
DIRECTIVES : 
    WITHOUT_OPERANDS | WITH_MYSTRING| WITH_ONLY_MYSTRING;

//Directive for END tag
WITHOUT_OPERANDS: 
    tag=('END') (',')? (inputs+=MYSTRING)*;

//Directive for BEGIN tag
WITH_MYSTRING: 
    tag=('BEGIN') (inputs+=MYSTRING)* (',' inputs+=MYSTRING)*;

// Directive for PRINT tag
WITH_ONLY_MYSTRING: 
    tag=('PRINT') inputs+=MYSTRING*;

//Each string may or maynot contain quotes with empty string
MYSTRING hidden(WS):
    ->(UNQUOTED|QUOTED)+;

//Terminal String for match quoted string including empty one
terminal QUOTED:
    "'" ( '\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\'|"'") )* "'"    
;

//Terminal string matching all other 
//Terminal string matching all other 
terminal UNQUOTED:
    ('a'..'z' | 'A'..'Z' | '_' | '0'..'9' | '-' | '*' | "/" | "\\" | '(' | ')' | '$' | '=')*
;



terminal ML_COMMENT : '/*' -> '*/';
terminal SL_COMMENT : '//' !('\n'|'\r')* ('\r'? '\n')?;

terminal WS         : (' '|'\t')+;

terminal NL         : ('\r'|'\n')+;

terminal ANY_OTHER: .;
 类似资料:
  • 我在javascript中使用Reactjs和通过AJAX使用API。我们如何解决这个问题?以前我使用CORS工具,但现在我需要启用CORS。

  • 问题内容: 如何使用T-SQL更改表中的一个属性以允许为null(不为null-> null)?也许更改表? 问题答案:

  • 问题内容: 希望能帮助您理解“ Java并发实践”中的以下内容: 从构造函数中调用可重写的实例方法(既不是私有方法也不是final方法)也可以使this引用转义。 这里的“转义”是否仅表示在实例完全构建之前,我们可能正在调用实例方法? 我看不到“ this”以任何其他方式逃避了实例的范围。 ‘最终’如何防止这种情况的发生?我缺少实例创建中的’最终’某些方面吗? 问题答案: 这意味着在类之外调用代码

  • 我想允许Joi在表单的标题字段中允许空格/空白。 明天和裘德一起工作。 也应该被允许 晨间漫步 此时,只有最后一个验证为真。以下是我的joi验证: 我添加了正则表达式,但没有结果。 什么是正确的方式?

  • 问题内容: 大家好,所以我试图允许一些文本输入在发送之前经过正则表达式检查。我希望文本仅包含AZ,0-9和空格“”字符。现在是我的代码: 但是,当我输入“这是一个测试”之类的内容时,这仍然会给出结果 有任何想法吗?谢谢大家 问题答案: 您不在正则表达式中包含空格。请尝试以下操作: