문제

나는 다른 방식으로 그렇게하라고 말할 것이라고 확신하지만, 특정한 이유로 이런 식으로해야합니다. 그렇지 않다면, 나는 갇히지 않을 것입니다 : -p

내가 작업중 인 스크립팅 언어는 다음과 같이 정의 된 변수를 수락해야합니다.

Variables: x(1), y("hi"); 

이것은 요구 사항입니다. 나는 작은 문법을 썼다.

int x = 1;
string y = "hi"; 

그러나 요구 사항이 변경되었습니다. 내 문법이 이렇게 보이는 방식은

syntax sDeclareVar = t:sType i:tID "=" x:sExpression ";"  => DeclareVar { VariableName{i},Type{t},Value{x}};

Stype의 값은 System.String, int32 등, 변수 이름 및 표현식이 무엇이든간에 하나입니다. 그런 다음 이것을 deplarevar 노드에 투사하고 필요한 매개 변수를 XML로 구문 분석 한 다음 Mgrammar를 XML을 구문 분석하고 내 ast를 잘 통과했습니다. 그들은 유형을 선언하지 않고 변수를 할 수 있기를 원하기 때문에 지금해야 할 일에 갇혀 있습니다. 즉, 적절한 클래스에 저장된 선언 된 유형이없는 변수를 얻는 방법 모든 도움이 감사하겠습니다. 모든 것이 의미가 있습니다.

도움이 되었습니까?

해결책 2

고마워 마커스, 그게 제가 올바른 길을 갔다. 여기 내가 한 일이있다.

구문 sdeclarevar = tvariablekeywords s : common.list (svardeclaration) ";" => variablelist {문장 {s}};

구문 svardeclaration = s : sintvardeclaration => s | s : sstringvardeclaration => s;

구문 sintvardeclaration = ","? i : tid "("x : tintegerliteral ")"=> deLlarevar {variableName {i}, type {type {rawValue { "system.int32"}}, value {rawvalue {x}}};

구문 sstringvardeclaration = ","? i : tid '('x : tstringliteral ')'=> deLlarevar {variableName {i}, type {type {rawValue { "system.string"}}}, value {stringLiteral {rawValue {x}}}};

위의 내용에 가까워서 변수를 목록에 저장하는 것이 더 쉬웠으며, 필요하지 않은 그래프에서 일부 노드를 꺼내기 위해 몇 가지 예측을 추가해야했습니다. 도와 주셔서 감사합니다.

다른 팁

그것은 당신의 문법의 나머지 부분이 어떻게 구성되는지에 따라 다르지만, 당신은 다음의 선을 따라 대략 무언가를하는 것을 막을 수 있습니다.

syntax sDeclareVar = "Variables:" sVarList ":";
syntax sVarList = sVarDeclaration ("," sVarList)?;
syntax sVarDeclaration = sIntVarDeclaration | sStringVarDeclaration | ...
syntax sIntVarDeclaration = i:tID "(" x:sIntegerLiteral ")"  => DeclareVar VariableName{i},Type{Int32},Value{x}};
syntax sStringVarDeclaration = i:tID "(" x:sStringLiteral ")"  => DeclareVar VariableName{i},Type{System.String},Value{x}};

기타 등등.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top