저는 Decison 프로그래밍 언어의 (부분적인) 문법을 구현하기 위해 bison (3.0.4)과 lexer를 사용하고 있습니다. 나는 수업 내에있는 것만 구현하고 있습니다. 내 작업은 간단합니다. 모든 생산 규칙 (문자열)을 트리에 저장 한 다음 인쇄하십시오. 예를 들어 , 당신은 class Foo { Foo(int arg1) { some2 a; } }하
현재 Decaf (프로그래밍 언어) 문법의 일부를 구현 중입니다. 여기 들소 코드의 관련 단편이다 그럼에도 불구하고 type:
INT
| ID
| type LS RS
;
local_var_decl:
type ID SEMICOLON
;
name:
THIS
| ID
| na
주어진 시리즈 내에서 특정 시퀀스를 식별 할 수 있는지 알고 싶습니다. lex은 3 개의 다른 토큰, 즉 START, AMINO, STOP을 생성한다. YACC에 의해 START으로 시작하고 일련의 AMINO 토큰을 가지고 STOP으로 끝나는 모든 시퀀스를 확인하고 싶습니다. 예 : START AMINO AMINO ... AMINO STOP 내가 전에 YA
내가 뭔가를 '(',')','+','-','*','/', 정수와 및 던지기 (예를 x=3에 대한) assignement을 포함하는 유일한 표현을 가능하게 기본적인 계산기입니다 https://github.com/dabeaz/ply 에서 첫 번째 예제를 읽고있다 표현의 평가 (결과도 정수가 아닙니다. 예 : '3/4'). 나는 다음하지만 그것이 작동하지 않는
내 파서에서 읽을 수 있습니다 파일이 있습니다 오류가 PRINT 토큰 주위에 발생하는 BEGINING.
XXX XY-1.
XXXX Y.
XXXX Z.
BODY.
PRINT "Please enter a number?".
END.
있는 test.txt를. 어휘 분석기에서 문자열 "Please enter a number?"이 제대로 처리
나는 책에서 yacc의 간단한 예제를 작성하려고하지만 컴파일하는 동안 오류가 발생합니다. 여기 내 example.l입니다 : %{
#include "y.tab.h"
%}
%%
a return(A);
b return (B);
. return(yytext[0]);
\n return('\n');
%%
int yywrap() {return 1;}
이 문법은 연산자의 우선 순위를 지정 했음에도 불구하고 충돌을 일으켰습니다. 드래곤 책에서도 그런 방법으로 해결되었지만 (아래의 처음 7 행으로 구현 된 방식) 충돌은 여전히 발생합니다! 다음은 이 yacc를 구현하는 코드입니다 %right THEN_KW
%right ELSE_KW
%left XOR_KW OR_KW
%right '='
%left
저는 flex와 bison을 사용하여 가상 프로그래밍 언어 용 구문 분석기를 만들고 있습니다. 유효하고 유효하지 않은 변수 이름이있을 것입니다. XXXX XY-1 // valid
XXXXX Z // valid
XXX Y // valid
XXX 5Aet // invalid
XXXX XXAB-Y // invalid
시작 부분의 x는 변수의 크기를 지
(shift 대 감소) 및 (reduce 대 reduce) LR 파서 충돌을 배웠습니다. (shift vs reduce) 충돌, 전도 교대. (감소 대 감소) 충돌이 발생하면 첫 번째 생산 규칙을 수행하십시오. 왜 그런가 ?? 왜 시프트 및 첫 번째 프로덕션 규칙을 선택 하시겠습니까 ??
그래서 flex/bison에 간단한 C 파서를 만들려고합니다. 함수 및 변수 선언과 구문 분석만을 구문 분석하면됩니다. 예() I이 .c 파일을 파싱 할 =하면 fopen을 yyin 사용 : #include <stdio.h>
int main()
{
int firstNumber, secondNumber, sumOfTwoNumbers;