0
저는 LAM이라고 부르는 모델 용 파서를 생성하기 위해 SableCC를 사용하려고합니다. 자체 LAM은 간단하고, 이들에 대한 (나는 많은 것들을 생략) 간단한 문법은 다음과 같습니다 문법의 연관성 스키마 변경
L := 0 | (x,y) | F(x1,...,xn) | L || L | L ; L
내가이 문법 쓴 :
Helpers
number = ['0' .. '9'] ;
letter = ['a' .. 'z'] ;
uletter = ['A' .. 'Z'] ;
Tokens
zero = '0' ;
comma = ',' ;
parallel = '||' ;
point = ';' ;
lpar = '(' ;
rpar = ')' ;
identifier = letter+ number* ;
uidentifier = uletter+ number* ;
Productions
expr = {term} term |
{parallel} expr parallel term |
{point} expr point term;
term = {parenthesis} lpar expr rpar |
{zero} zero |
{invk} uidentifier lpar paramlist rpar |
{pair} lpar [left]:identifier comma [right]:identifier rpar ;
paramlist = {list} list |
{empty} ;
list = {var} identifier |
{com} identifier comma list ;
이 기본적으로 작동을하지만,이 부작용 : 왼쪽 연관입니다. 나는 그런
L = L1 || L2 ; L3 || L4
이있는 경우 예를 들어,이 같은 구문 분석됩니다 :
L = ((L1 || L2) ; L3) || L4
내가 모든 우선 순위를 부여 할 ";" 운영자, 그래서 L이
L = (L1 || L2) ; (L3 || L4)
같은 구문 분석했다 ("||"와 같은 다른 것들, 수는 남아 연관 왼쪽)
내 질문은 :
- 이 할 수있는 팁이 있습니다 그러한 변환은 "자동화 된"방식으로 수행됩니까?
- ";"에있는 모든 우선 순위의 문법이 될 수있는 방법은 무엇입니까? ? 또한 "RTFM 링크"를 수락
은 - D 는 당신에게 당신이 원하는 연산자 우선 순위와 일치 규칙의 계층 구조를 만드는 데 필요한 모든
유용합니다. 따라서 기본적으로 우선 순위가 더 높은 연산자가 해당 계층 위에 위치하는 계층 구조를 만들어야합니다. – kronat
@kronat * 우선 순위가 *보다 낮은 연산자는 계층 구조에서 위쪽에 위치합니다. – Apalala