如何在xtext

时间:2018-04-15 05:27:20

标签: xtext

从终端

创建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):.. / ork.xtext.example.mydsl / src-gen / org / xtext / example / mydsl / parser /antlr / internal / InternalMyDsl.g:30:3:决定可以匹配输入等as&#34; RULE_UNQUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 警告(200):.. / ork.xtext.example.mydsl / src-gen / org / xtext / examples / mydsl / parser /antlr / internal / InternalMyDsl.g:30:3:决策可以匹配输入,例如&# 34; RULE_QUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 warning(200):.. / ork.xtext.example.mydsl / src-gen / org / xtext / examples / mydsl / parser /antlr / internal / InternalMyDsl.g:361:3:决策可以匹配输入,例如&# 34; RULE_UNQUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 warning(200):.. / ork.xtext.example.mydsl / src-gen / org / xtext / examples / mydsl / parser /antlr / internal / InternalMyDsl.g:361:3:决策可以匹配输入,例如&# 34; RULE_QUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 警告(200):.. / ork.xtext.example.mydsl / src-gen / org / xtext / examples / mydsl / parser /antlr / internal / InternalMyDsl.g:438:3:决策可以匹配输入,例如&# 34; RULE_UNQUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 警告(200):.. / ork.xtext.example.mydsl / src-gen / org / xtext / examples / mydsl / parser /antlr / internal / InternalMyDsl.g:438:3:决策可以匹配输入,例如&# 34; RULE_QUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 警告(200):.. / ork.xtext.example.mydsl / src-gen / org / xtext / examples / mydsl / parser /antlr / internal / InternalMyDsl.g:479:2:决策可以匹配输入,例如&# 34; RULE_QUOTED&#34;使用多种选择:2,3 结果,替代(s)3被禁用该输入 警告(200):.. / ork.xtext.example.mydsl / src-gen / org / xtext / examples / mydsl / parser /antlr / internal / InternalMyDsl.g:479:2:决策可以匹配输入,例如&# 34; RULE_UNQUOTED&#34;使用多种替代方案:1,3 结果,替代(s)3被禁用该输入 错误(208):.. / ork.xtext.example.mydsl / src-gen / org / xtext / examples / mydsl / parser /antlr / internal / InternalMyDsl.g:491:1:永远不能匹配以下令牌定义因为先前的标记匹配相同的输入:RULE_INT 警告(200):.. / ork.xtext.example.mydsl.ide / src-gen / org / xtext / example / mydsl / ide / contentassist / privilel / internal / InternalMyDsl.g:257:33:决策可以匹配输入例如&#34; RULE_UNQUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 警告(200):.. / ork.xtext.example.mydsl.ide / src-gen / org / xtext / example / mydsl / ide / contentassist / privilel / internal / InternalMyDsl.g:257:33:决策可以匹配输入例如&#34; RULE_QUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 警告(200):.. / ork.xtext.example.mydsl.ide / src-gen / org / xtext / example / mydsl / ide / contentassist / privilel / internal / InternalMyDsl.g:549:45:决策可以匹配输入例如&#34; RULE_UNQUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 警告(200):.. / ork.xtext.example.mydsl.ide / src-gen / org / xtext / example / mydsl / ide / contentassist / privilel / internal / InternalMyDsl.g:549:45:决策可以匹配输入例如&#34; RULE_QUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 警告(200):.. / ork.xtext.example.mydsl.ide / src-gen / org / xtext / example / mydsl / ide / contentassist / privilel / internal / InternalMyDsl.g:604:42:决策可以匹配输入例如&#34; RULE_QUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 警告(200):.. / ork.xtext.example.mydsl.ide / src-gen / org / xtext / example / mydsl / ide / contentassist / privilel / internal / InternalMyDsl.g:604:42:决策可以匹配输入例如&#34; RULE_UNQUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 警告(200):.. / ork.xtext.example.mydsl.ide / src-gen / org / xtext / example / mydsl / ide / contentassist / privilel / internal / InternalMyDsl.g:738:47:决策可以匹配输入例如&#34; RULE_QUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 警告(200):.. / ork.xtext.example.mydsl.ide / src-gen / org / xtext / example / mydsl / ide / contentassist / privilel / internal / InternalMyDsl.g:738:47:决策可以匹配输入例如&#34; RULE_UNQUOTED&#34;使用多种选择:1,2 结果,替代(s)2被禁用该输入 错误(208):.. / ork.xtext.example.mydsl.ide / src-gen / org / xtext / example / mydsl / ide / contentassist / privilel / internal / InternalMyDsl.g:930:1:以下标记定义永远不会匹配,因为先前的标记匹配相同的输入:RULE_INT 8287 [main] INFO text.xtext.generator.XtextGenerator - 生成通用基础架构

我已经尝试过更新的语法,但它仍无效。

输入文字:BEGIN ABC&#39; &#39; 123457

得到错误:在角色上没有可行的选择&#39;

输入文字:PRINT ABC&#39; &#39; ABC

收到错误:无关的输入&#39; \ r \ n&#39;期待EOF

输入文字:

BEGIN ABC = 12,def = 34,ghij 123456

    xyx=123,abc=345                    000001

收到错误:在输入处没有可行的选择&#39; \ r \ n \ r \ n&#39;

除了

之外,所有警告都消失了

错误(208):永远不能匹配以下标记定义,因为先前的标记匹配相同的输入:RULE_INT

错误(208):永远不能匹配以下标记定义,因为先前的标记匹配相同的输入:RULE_INT

1 个答案:

答案 0 :(得分:0)

您是否考虑使用两个终端规则和一个数据类型规则,例如。

//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: .;