2012-07-05 10 views
2

본인 사이트의 사용자를위한 메시징 시스템을 작성합니다. 개별 메시지가 동적 사용자 세그먼트를 타겟팅 할 수 있도록 세그먼트 화를 구현합니다. 주어진 메시지의 세그먼트 정의에는 여러 개별 세그먼트 일치가 포함될 수 있으므로 메시지 본문의 내용도 세그먼트 화해야합니다. 필자는 훨씬 숙련 된 프로그래머와의 대화를 통해 렉서와 파서 생성기를 살펴볼 것을 제안 할 때까지 사용자 정의 렉서/파서 (심지어 렉서스 나 파서에 대해 알지 못하는)가 아닌 것으로 밝혀진 것을 작성함으로써이 작업을 시도했습니다. 나는 약간의 연구를 수행했으며, PHP 네이티브 라임 파서 생성기가 필자가 작성한 코드가 PHP임을보고 최선의 선택 인 것으로 나타났습니다.라임 파서 생성기 문법 예제 검색 중 ... 그냥 찾을 수 없습니다.

저는 계산기 예제와 metagrammar에 대한 문법 파일을 보았습니다. (사실, 나는 대부분의 소스 코드를 분석하는데 몇 시간을 보냈습니다.)하지만 저는 정말 저의 머리를 감싸는 데 어려움을 겪고 있습니다. 간단한 문법 파일조차 만드는 법에 관한 것. 레몬이나 다른 PG의 문법 정의 라기보다는 문법 정의가있는 것처럼 보이기 때문에 라임을위한 문법 파일 예제를 아는 사람이 있습니까?

당신은 내가 특별히 같은 형식의 조건문을 작성하는 것을 시도하고, 구체적인 예를 제공 기꺼이 할 수 있어야 다음

This is a text block all users will see. 

{{IF user.modules.sms}} 
This is a text block only visible to users with the sms module enabled 
{{/IF}} 

{{IF user.modules.anothermodule AND user.previouslogin < (now() - 3600)}} 
This is a text block only visible to users with the anothermodule module enabled, whose previous login was more than an hour ago 
{{/IF}} 

아니면 그냥 일반적으로 다른 사람이 어떤 제안을 하세 경우 이러한 기능을 구현하는 다른 가능한 방법은 조언에 개방적입니다! 이 메시지를 쓰는 사람들은 프로젝트 관리자와 마케팅 담당자가 될 것이므로 PHP를 사용할 수 없다는 것을 명심하십시오.

답변

0

바퀴를 재발 명하지 마십시오. 어쩌면 당신은 Smarty 같은 것을 사용해야합니다. 신뢰할 수있는 사용자가 코드를 실행하므로 위험 할 수 있으므로주의해야합니다.

functionnalities 수백을 계획하지 않으면 적절한 regexes 트릭을해야합니다.

+0

그저 문제 일 것입니다 ... 미래에 어떤 시점에서이 세분화 기능은 최종 사용자가 직접 인라인 메시지 세분화를 만들 수있는 기능으로 구현해야합니다. PHP 기능에 대한 실제 액세스를 제공하는 템플릿 엔진을 사용하는 것은 선택 사항이 아닙니다. –

+0

... 또한이 구문 분석 기능을 쉽게 확장 할 수있는 옵션이 필요하고 문법 파일에 명령문을 추가하고 클라이언트 코드를 약간 재 구현하는 것이 수동으로 전체를 작성하는 것보다 바람직합니다 일부 가정용 양분 파싱 방법의 새로운 구현. 나는 파싱을 수행하기 위해 정규 표현식을 사용하는 것이 위험과 복잡성으로 가득차 있기 때문에 여러 곳에서 읽었습니다. 그래서 나는 라임과 같은 것을 사용하고자합니다. 그리고 바퀴를 재발 명한다고 말하는 것은 아닙니다. –

+0

그런 다음 PHPBB (BBcode), MediaWiki, MarkDown, Smarty와 같은 다른 라이브러리가 어떻게 구현되는지 살펴보아야합니다. 힌트를 줄 수도 있습니다! –

0

나는 lex & yacc을 사용하여 90 년대 중반부터 C 프로그램을 작성했지만 파서 생성기 작업을 수행하지는 못했지만, 만족스러운 답을 얻지 못했거나 2012 년 이후로 질문을 업데이트 한 것을 볼 수 있기 때문에 제공 할 것입니다. : 당신이 파서 생성기는 PHP 코드를 방출 할 때 lime은 yacc에 대한 확인을 대체처럼 일반적으로에서

, 그것은 보이지만 the calculator example에 표시된 토큰 화() 메소드는 렉스에 대한 매우 약한 대신합니다. 그래서 일반적으로 당신의 목표가 "메시지"안에 프로그래밍 로직의 비트를 삽입하는 것이라면 "처음부터"토큰 화기 로직을 ​​작성하는 것이 도전 과제가 될 수 있습니다.

하지만 당신의 제안 예를 들어 메시지가 더 큰 문제 제기 :

정확히 어떻게 파서 생성기에 의해 방출 될 PHP 코드가 사용됩니다?

은 특히 :

  • 파서 생성 된 코드의 이러한 덩어리 "독립"웹 페이지가 될 것이다 - 당신이 가고있는 방법을 직접 URL을 통해 주소와 웹 서버에 의해 직접 렌더링 (이 경우 다음 질문입니다 웹 서버에게 PHP 코드를 CGI 스크립트로 실행하도록 지시하는 것)? 아니면 어떤 종류의 응용 프로그램 프레임 워크 (또는 "메시지 렌더러") 안에서 실행됩니까?

  • (PHP) 프로그램 상태가 어떻게 유지됩니까? 당신의 예제는 "user.previouslogin"을 가리키고 있습니다. 이것은 페이지 뷰뿐만 아니라 어떤 종류의 "세션"에서도 지속성을 제시합니다.

  • 태그 안에 메시지에 삽입하려고 제안하는 논리가 실제로 PHP 또는 Javascript의 변형이거나 진정한 새로운 것입니까? 정적 페이지 내부

포함하기 로직 (서버 사이드는 결국 90 년대에 인기가 있었다 포함합니다) 오래된 생각이다, 현대 템플릿 엔진 (우고 메다에 의해이 질문에 대해 제안) 매우 강력하다. 자신의 메시지 구문 분석 + 렌더링 시스템을 실제로 돌릴 수 있는지 여부는 예제에서 "user.modules. *"라고 쓸 때 참조하는 응용 프로그램 컨텍스트에서 부과 된 제약 사항에 따라 달라집니다.