eclipse-langium / langium

Next-gen language engineering / DSL framework
https://langium.org/
MIT License
663 stars 61 forks source link

Generate from language file is endless #1472

Closed tavoda closed 2 months ago

tavoda commented 2 months ago

Langium version: 3.0.0

Steps To Reproduce

Generate from language file is endless (try uncomment more rules in DslAttribute): grammar Sculptor4

entry DslModel: (imports+=DslImport)* app=DslApplication;

DslImport: 'import' importURI=STRING ';';

DslApplication: (doc=STRING)? (("Application" name=ID "{" "basePackage" "=" basePackage=DslJavaIdentifier) | ("ApplicationPart" name=ID "{")) (modules+=DslModule)* "}";

DslModule: (doc=DOC)? "Module" name=ID "{" (external?="external")? ("basePackage" "=" basePackage=DslJavaIdentifier )? ("hint" "=" hint=STRING)? (domainObjects+=DslEntity)* "}";

DslEntity: (doc=DOC)? (abstract?="abstract")? "Entity" name=ID ("extends" (("@"extends=[DslEntity:ID]) | (extendsName=DslJavaIdentifier)))? "{" ("package" "=" package=DslJavaIdentifier )? ( ((gapClass?="gap") | (noGapClass?="nogap"))? (scaffold?="scaffold")? ("hint" "=" hint=STRING)? ("databaseTable" "=" databaseTable=STRING)? ("discriminatorValue" "=" discriminatorValue=STRING)? ("discriminatorColumn" "=" discriminatorColumn=STRING)? ("discriminatorLength" "=" discriminatorLength=STRING)? ("validate" "=" validate=STRING)? ((notAggregateRoot?=NOT "aggregateRoot") | ("aggregateRoot"))? ("belongsTo" (("@")?belongsTo=[DslEntity:ID]))? ) (attributes+=DslAttribute)* "}";

DslAttribute: (doc=DOC)? ( (key?="key") ((notChangeable?=NOT "changeable") | ("changeable")) ((required?="required") | (NOT "required")) (((nullable?="nullable") | (NOT "nullable")) ("=" nullableMessage=STRING)?) (index?="index") ((assertFalse?="assertFalse") ("=" assertFalseMessage=STRING)?) ((assertTrue?="assertTrue") ("=" assertTrueMessage=STRING)?) ("hint" "=" hint=STRING) ((creditCardNumber?="creditCardNumber") ("=" creditCardNumberMessage=STRING)?) ("digits" "=" digits=STRING) ((email?="email") ("=" emailMessage=STRING)?) ((future?="future") ("=" futureMessage=STRING)?) ((past?="past") ("=" pastMessage=STRING)?) / ("max" "=" max=STRING)? ("min" "=" min=STRING)? ("decimalMax" "=" decimalMax=STRING)? ("decimalMin" "=" decimalMin=STRING)? ((notEmpty?="notEmpty") ("=" notEmptyMessage=STRING)?)? ((notBlank?="notBlank") ("=" notBlankMessage=STRING)?)? ("pattern" "=" pattern=STRING)? ("range" "=" range=STRING)? ("size" "=" size=STRING)? ("length" "=" length=STRING)? ("scriptAssert" "=" scriptAssert=STRING)? ("url" "=" url=STRING)? ("validate" "=" validate=STRING)? (transient?="transient")? ("databaseColumn" "=" databaseColumn=STRING)? ("databaseType" "=" databaseType=STRING)? / ) ";";

/ Basic types / DslJavaIdentifier returns string: ID ("." ID)*;

/ Basic terminals / hidden terminal WS: /[\s\n\r]+/; hidden terminal ML_COMMENT: /\/*[\s\S]?*\//; hidden terminal SL_COMMENT: /\/\/[^\n\r]/;

terminal DOC: /#./; terminal ID: /\^?[a-zA-Z][\w]/; terminal INT returns number: /[0-9]+/; terminal STRING: STR_DOUBLE_Q | STR_SINGLE_Q; terminal STR_DOUBLE_Q: /"(?:[^\"]|\.)"/; terminal STR_SINGLE_Q: /'(?:[^\']|\.)*'/; terminal NOT: /!|not/;

msujew commented 2 months ago

Thank you for the report. This is likely a duplicate of https://github.com/eclipse-langium/langium/issues/775.