从终端
创建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
答案 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: .;