드래곤 북의 부록에서 LL (1) 프런트 엔드가 예제로 제공되었습니다. 나는 그것이 매우 도움이된다고 생각한다. 그러나 아래의 문맥 자유 문법에 대해서는 적어도 LL (2) 파서가 필요하다는 것을 알게되었습니다.이 LL (1) 파서를 LL (k) 파서에 적용하는 방법은 무엇입니까?
statement : variable ':=' expression
| functionCall
functionCall : ID'(' (expression (',' expression)*)? ')'
;
variable : ID
| ID'.'variable
| ID '[' expression ']'
;
어떻게하면 LL (1) 파서가 k 미리보기 토큰을 지원하도록 렉서를 조정할 수 있습니까? 우아한 방법이 있습니까?
토큰 용 버퍼를 추가 할 수 있습니다. 프로그래밍에 대해 자세히 설명하고 싶습니다.
이
은 파서입니다 :class Parser
{
private Lexer lex;
private Token look;
public Parser(Lexer l)
{
lex = l;
move();
}
private void move()
{
look = lex.scan();
}
}
과 Lexer.scan()
스트림에서 다음 토큰을 반환합니다.
LL 노트는 모든 k에 대해 LL (1)로 항상 줄일 수 있다고 말하는 정리가 있다는 것을 (대학 노트를 올바르게 기억할 수 있다면) 생각합니다. 그 정리를 이용하면 우아한 방법이 될 것입니다. – Bathsheba
기꺼이 도와 드리 겠으나 코드를 보여주십시오 :-) – cadrian
@Bathsheba 정말요? 세부 사항을 알려주시겠습니까? – zsf222