2017-11-21 4 views
0

의 우리가이 문법을들소에서 문법에서 변수를 시작하는 방법?

start: 
expressions; 
expressions: 
      expressions expression 
      | expression 
      ; 
expression: 
      expression NAME value { float $2 = $3;} 
      | NAME value { float $1 = $2;} 
      ; 
value: 
     INT '.' INT 
     ; 

이이 문법 우리가이 입력

을 적용 가정 해 봅시다 2.0 B 3.0

이는 = 2.0 플로트 (이 같은 우리의 문법으로 해석해야한다 ; float b = 3.0;)

내 목표는 실제로 이름을 가진 일부 변수를 선언하고 생성자를 사용하여 myClass NAME (value)과 같은 작업을 수행하는 것입니다. 값은 실수입니다.

문제는 내 예제에서 값과 같은 문법적 블록의 전체 값을 얻는 방법과 입력 파일에서 각 줄마다 바뀌고 변수 이름의 선언을 만드는 방법을 모르는 것입니다. 일반 float a = $ 1;

은 이미 나에게 당신은 C++에서 변수 이름 대신에 문자열을 사용할 수 없습니다 NAME과 VALUE

답변

0

을 줄 것이다 나의 플렉스 tokeniser의 작업이있다. 대신 문자열에서 부동 소수점으로 매핑을 정의한 다음 float $2 = $3; 대신 the_map[$2] = $3;과 같은 작업을 수행해야합니다.

관련없는 참고 사항에 value에 조치를 추가하여 부동 소수점 값을 생성하거나 렉서가 부동 소수점에 대한 단일 토큰을 생성하고이를 사용하도록 조치를 추가해야합니다. 그렇지 않으면 expression 님의 작업에서 $3에 적절한 값이 지정되어 있지 않습니다.

+0

플로트를 생성하는 방법은 무엇입니까? 새 유니온을 만들고 float이 될 값을위한 유형을 생성하는 것과 같습니까? – Gengetsu

+0

@Gengetsu 두 개의 정수 중에서 부동 소수점을 만들려면 두 점을 사이에 점이있는 문자열에 붙여 넣은 다음 해당 문자열에'strtod'를 사용하면됩니다. 그것은 당신의 렉서가'int'가 아닌 INT 토큰에 대한 문자열 값을 생성한다고 가정합니다. 렉서에서'int'를 얻는다면, 그것들을 올바르게 사용할 수있는 방법이 없습니다 (당신은 소수 부분에서 0을 잃을 것입니다). 더 나은 대안은 어쨌든 렉서가 어쨌든 수레를위한 단일 토큰을 만들어내는 것일 것입니다. 나는 당신의 코멘트의 두 번째 부분을 이해하지 못합니다. – sepp2k

+0

좋아요, 제 의견의 두 번째 부분은 INT (int)를 이미 부동이라고 말한 부동 소수점으로 변환하는 방법입니다. 그래서 지금 무엇을 해야할지 고마워요. – Gengetsu

관련 문제