0
가정하자 나는 다음과 같은 문법을 받았다 :이 될 문법을 다음과 같은 조작 LL (1)
start -> statement //cannot change
statement -> assignment SEMICOLON
statement -> function_call SEMICOLON
assignment -> IDENTIFIER EQUAL expression
function_call -> IDENTIFIER LPAREN parameters RPAREN SEMICOLON
문법 지금 LL (1) 문에 대한 비 터미널 (할당 및 FUNCTION_CALL) 모두 가지고 있기 때문에 할 수 없다 IDENTIFIER는 각 제품의 첫 번째 터미널입니다. 파서가 어느 경로를 사용할지 결정할 수 있습니다.
위의 문법을 LL (1)로 조작 할 수있는 방법이 있습니까? 아니면 불가능한가요?
왼쪽 - 인수 분해는 쉽게 검색 할 수 있어야합니다. 힌트 :'성명 : IDENTIFIER rest; 휴식 : 뭔가 | something-else' – rici
@rici 만약 당신이 [statement -> compound_statement]와 [compound_statement -> assignment | function_call] 여전히 LL (1)로 간주됩니까? – BDillan
아니요, 그렇지 않습니다. LL (1)이 되려면 다음 (1) 토큰을보고 어떤 작품이 확장되는지 알아야합니다. 다음 토큰은 IDENTIFIER가 될 것이고, 그것은'statement -> compound_statement'를 예측할 수는 있지만 두 개의'compound_statement' 프로덕션 중 어느 것이 아닌지 예측할 수 있습니다. 따라서 LR (1)과 같은보다 강력한 구문 분석 알고리즘을 선택하거나 선택해야합니다. – rici